程序
什么是程序
- 指计算机程序,是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具;
- 程序是一个管理名词,如一个环节,内部嵌套着一系列复杂的列逻辑慎密的一个组件,若一个地方出问题则会影响到整个主体。
- 用于描述进程要完成的功能,是控制进程执行的指令集
进程
什么是进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
程序与进程的区别
- 程序存放在硬盘上
- 进程存放在内存中
进程的非正常死亡会导致机器死机等危害
进程具有的特征
- 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
- 并发性:任何进程都可以同其他进程一起并发执行
- 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
- 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。
僵尸进程
正常情况下进程结束,父进程会回收子进程的硬件资源。
僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。
通俗点就是如果子进程出现意外关闭,父进程没有感知到,就不会回收资源,认为关闭父进程,资源不会回收就会产生僵尸进程
进程使用的内存问题
- 内存泄漏:进程没有将内存是否,导致一直处于占用状态
- 内存溢出:只能写10M的文件,写了10M以上的文字,就是溢出
- 内存不足:OOM(out of 买么瑞)
一个进程至少有一个线程
线程
线程(英语:thread)是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
随着计算机的发展,对CPU的要求越来越高,进程之间的切换开销较大,已经无法满足越来越复杂的程 序的要求了。于是就发明了线程。
进程与线程的区别
- 定义不一样,进程是执行中的一段程序,而一个进程中执行中的每个任务即为一个线程。
- 一个线程只可以属于一个进程,但一个进程能包含多个线程。
- 线程无地址空间,它包括在进程的地址空间里。
- 线程的开销或代价比进程的小。
进程分类
前台进程
一直占用屏幕,占用终端
后台进程
不需要占用屏幕
守护进程
- 帮别人守护(监听)
- 在系统引导过程中启动的进程,和终端无关进程
查看进程相关命令
ps命令
可以查看进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/数字 目录/status 下的各文件中
查看静态的进程
- "ps aux" 可以查看系统中所有的进程
- "ps -le" 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级
- "ps -l" 只能看到当前 Shell 产生的进程
常用选项
| 选项 | 功能 |
|---|---|
| a | 显示终端下所有进程 |
| u | 使用以用户为主的格式输出进程信息 |
| x | 显示当前用户在所有终端下的进程信息 |
| -e | 显示系统内的所有进程信息 |
| -l | 使用长(Long)格式显示进程信息 |
| -f | 使用完整的(Full)格式显示进程信 |
| -o | 选项显示定制的信息(pid,cmd...) |
| k | --sort 属性:对属性排序,属性前加 - 表示降序排列 |
ps aux
- TTY:在那个终端运行
- STAT:进程状态
- COMMAND:产生此进程的命令名
ps -le
| 表头 | 含义 |
|---|---|
| F | 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行; 4:进程使用超级用户权限; |
| S | 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致; |
| UID | 运行此进程的用户的 ID; |
| PID | 进程的 ID; |
| PPID | 父进程的 ID; |
| C | 该进程的 CPU 使用率,单位是百分比; |
| PRI | 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改 |
| NI | 进程的优先级,数值越小,该进程越早被执行;可以人为修改 |
| ADDR | 该进程在内存的哪个位置; |
| SZ | 该进程占用多大内存; |
| WCHAN | 该进程是否运行。"-"代表正在运行; |
| TTY | 该进程由哪个终端产生; |
| TIME | 该进程占用 CPU 的运算时间,注意不是系统时间; |
| CMD | 产生此进程的命令名; |
PRI与NI的关系
PRI(最终值)=PRI(原始值)+NI
修改NI注意事项
- NI值的范围是-20~19;
- 普通用户调整NI值的范文是0~19,而且只能调整自己的进程;
- 普通用户只能调高NI值,而不能降低,如原本NI值为0,则只能调整为大于0;
- root用户才能设定晶层NI值为负值,而且可以调整任何用户的进程;
用户只能修改NI的值,不能直接修改PRI
ps
top
显示详情信息
选项
| 选项 | 功能 |
|---|---|
| -d | 指定 top 命令每隔几秒更新。默认是 3 秒 |
| -b | 使用批处理模式输出 |
| -n | 指定top命令执行的次数 |
| -p(pid) | 仅查看指定id的进程 |
| -s | 使 top 命令在安全模式中运行,避免在交互模式中出现错误 |
| -u(用户名) | 只监听某个用户的进程 |
因为是动态的,所以会一直变化,并不会自动退出,需要手动按Ctrl+c退出
top命令输出内容
top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。
命令的输出主要分为两部分:
- 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的。
- 第二部分从第六行开始,显示的是系统中进程的信息。
pstree命令进程树
以树形结构列出进程信息
常用选项
| 选项 | 说明 |
|---|---|
| -a | 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等 |
| -p | 显示pid |
| -T | 不显示线程tread,默认显示线程 |
| -u | 先使用户切换 |
| -H | pid 高亮显示指定进程及其前辈进程 |
lsof
lsof [选项]
常用选项
| 选项 | 功能 |
|---|---|
| -c(字符串) | 只列出以字符串开头的进程打开的文件 |
| +d(目录名) | 列出某个目录中所有被进程调用的文件 |
| -u(用户名) | 只列出某个用户的进程打开的文件 |
| -p(pid) | 列出某个 PID 进程打开的文件 |
lsof | more
- 查询系统中所有进程调用的文件
vmstat监控系统资源
vmstat [-a] [刷新延时 刷新次数]
进程管理
- 前台执行:通过终端启动,且启动后一直占据终端
- 后台执行:可通过终端启动,但启动后即转入后台运行(释放终端)
命令 &
格式:命令[空格]&
将命令放入后台执行
- 让运行中的进程放入后台: Ctrl+z
- 未运行的放入后台:COMMAND &
jobs
查看运行列表
fg
调回后台任务,将加入后台任务进程,调回到前台执行
并行执行任务
可以多个任务一起执行
结束进程
kill
可以通过pid来删除
kill pid
| 信号编号 | 信号名 | 含义 |
|---|---|---|
| 0 | EXIT | 程序退出时收到该信息。 |
| 1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
| 2 | INT | 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。 |
| 3 | QUIT | 退出。 |
| 9 | KILL | 杀死进程,即强制结束进程。 |
| 11 | SEGV | 段错误。 |
| 15 | TERM | 正常结束进程,是 kill 命令的默认信号。 |
计划任务
at一次性计划任务
- 格式
at [选项] [时间]
打完想做的事按ctrl+d提交
atq:按任务列表
crontab周期
crontab的配置文件在 /etc/crontab
- 分(0~59)
- 时(0~23)
- 日(1~31)
- 月(1~12)
- 周(0~7(0和7都表示星期日))
crontab命令格式
- crontab -e [-u 用户名] //编辑计划任务
- crontab -l [-u 用户名] //查看计划任务
- crontab -r [-u 用户名] //删除计划任务
特殊表示
| 特殊符号 | 功能 |
|---|---|
| * | 表示任务时间,比如第一个"*"就代表一小时中每分钟都执行一次的意思。 |
| , | 代表多个不连续的时间点。比如 "0 8,12,16 * * * 命令" 就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。 |
| - | 代表连续的时间范围。比如"0 5 * * 1-6 命令",代表在周一到周六的凌晨 5 点 0 分执行命令 |
| / | 代表每隔多久执行一次(即间隔的时间频率)。比如"*/10命令",代表每隔 10 分钟就执行一次命令。 |
使用crontab注意事项
- 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间
- crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
- 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆
- 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。
- 一定要使用
管理crontab计划任务
- 编辑计划任务 crontab -e [-u 用户名]
- 查看计划任务 crontab -l [-u 用户名]
- 删除计划任务 crontab -r [-u 用户名]