程序(Program):通常为二进制程序,放置在存储媒介中(如硬盘、光盘、软盘、磁带等),为物理文件的形式存在
进程(Process):程序被触发时,执行者的权限与属性、程序的代码与所需数据等都会被加载到内存中,操作系统并给予这个内存中的单元一个标识符(PID
),即进程就是一个正在运行中的程序。进程之间是由相关性,固有父进程与子进程之分,而 Linux 系统所有进程的父进程就是 systemd
这个 PID
为 1
号的进程。
任务:常驻在内存中的进程,通常都是负责一些系统所提供的功能,以服务用户各项任务,因此这些常驻的进程就会被称为服务。
Linux 的调用过程通常为
fork-and-exec
的流程,进程都会借由父进程以复制(fork
)的方式产生一个一模一样的子进程,然后被复制出来的子进程就会exec
的方式来执行实际要执行的进程,最终就成为一个子进程的存在。
衍生出来的其他进程在一般状态下,也会沿用父进程的相关权限,进程的父进程通过PPID
来判断。
在任务管理中,可以出现提示字符并让你操作的环境就称为 前台,至于其它的任务就可以让放置到 后台 中暂停或运行,在后台的进程你无法使用[ctrl] + c
终止它。
1 任务管理( job control)
在执行任务管理的操作中,其实每个任务都是目前 Bash 的子进程,即彼此之间是由相关性的,无法用任务管理的方式有 tty1
的环境去管理 tty2
的 bash.
1.1 将命令丢到后台执行的 &
在前台输入命令,在该命令的最后面紧接 &
符号代表将该命令丢到后台中,就可以将该命令丢到后台中执行,此时可以继续操作前台的任务,比如:
tar -zpcf /tmp/etc.tar.gz /etc &
此时会返回如下信息:
[1] 14432
其中 [1]
表示为任务号码(job number),14432
表示 PID。
1.2 将当前的任务丢到后台中暂停 [ctrl] + z
默认情况下,按下 [ctrl] + z
组合键,返回如下信息:
[1]+ Stopped vim ~/.bashrc
其中 [1]
表示任务号码,+
表示最近一个被丢到后台的任务,切实目前后台默认会被使用的任务(与下面的 fg
命令有关),Stopped
表示任务的状态,默认的,[ctrl] + z
丢到后台的任务状态都为 Stopped
1.3 jobs
jobs
命令用于查看目前的后台任务的状态、有多少任务在后台,它的语法如下:
job [-lrs]
它的选项与参数:
-l
:列出 PID 的号码-r
:仅列出正在后台run
的任务-s
:仅累出正在后台stop
的任务
1.4 fg
fg
命令可以将后台任务拿到前台来处处理,它的语法如下:
fg %jobNumber
其中 %jobNumber
就是任务号码,此时的 %
是可由可无的。
1.5 bg
bg
命令可以将任务在后台下的状态变成运行中(Running),语法如下:
bg %jobNumber
1.6 kill
使用 kill
命令可以对任务进行 删除、重启 等,此时只需给予该任务一个信号(Signal),它的语法如下:
kill -l
kill -signal %jobNumber
选项与参数:
-l
:列出目前kill
能够使用的信号Signal
有哪些- 一下列出常用的
Signal
的含义:-1
:重新读取一次参数的配置文件,类似 reload-2
:如同[ctrl] + c
的效果-9
:立刻、强制删除任务-15
:以正常地进程方式终止一项任务,注意与-9
的区别
另外,
kill
后面接的数字默认是 PID,如果想要管理 Bash 的任务,就要使用%数字
这种方式
1.7 nohup
前面所提及到的“后台”是 Bash 的后台,并非系统的后台,所以 任务管理的后台依旧与终端有关,即如果将任务使用 &
丢到后台执行,在该任务还没结束的情况下脱机了,该任务也就不会继续执行了。
此时可以使用上一章的 at
,因为 at
是将任务放置到系统后台而与终端无关。如果不想使用 at
,还可以使用 nohup
命令处理,nohup
命令可以在脱机或注销系统后,还能够让任务继续执行。
它的语法如下:
nohup [命令与参数] #在终端前台中任务
nohup [命令与参数] & #在终端后台中任务
nohup
不支持 Bash 内置的命令
2 进程管理
2.1 查看进程
查看进程可以使用静态命令 ps
或动态命令 top
。
2.1.1 ps
命令
ps
命令:将某个时间点的进程运行情况获取下来,常用的查看系统所有的进程例子如下:
ps aux # 查看系统的所有进程
ps -l # 仅查看自己的 bash 相关进程
ps
命令的选项与参数:
-A
:所有进程均显示出来-a
:不显示与终端有关的所有进程-u
:有效使用者相关的进程-x
:通常与a
这个参数一起使用,可列出较完整的信息
输出格式规划:
l
:较长,较详细的将 PID 的信息列出j
:任务的格式-f
:更为完整的输出
使用 ps -l
命令最后的输出结果如下:
各字段的意义:
F
:代表这个进程的标识,说明这个进程的权限,常见号码有:4
:权限为ROOT
1
:表示此子进程仅执行复制(fork)而没有实际执行(exec)
S
:代表这个进程的状态(Stat),主要状态有:R
(Running):该进程正在进行S
(Stop):该进程目前正在睡眠状态,但可以被唤醒D
:不可被唤醒的睡眠状态,通常这个进程可能在等待 I/0 的情况T
:停止状态,可能是在任务控制(后台暂停)或跟踪状态Z
(Zombie):僵尸状态,进程已经终止但却无法被删除到内存之外
UID
/PID
/PPID
:代表该进程被 UID 所拥有 / 进程的 PID / 该进程的父进程 PID 号码C
:代表 CPU 的使用率PRI
/NI
:Priority / Nice 的缩写,表示该进程被CPU所执行的优先级,数值越小表示该进程越快被CPU执行ADDR
/SZ
/WCHAN
:与内存有关,ADDR 指出该进程在内存的哪个部分;SZ 代表该进程用掉了多少内存;WCHAN 表示目前进程是否运行,若为-
,表示运行中TTY
:登录者的终端位置TIME
:此进程使用CPU时间CMD
:就是 command 的缩写,表示造成该进程的触发进程的命令是什么
使用 ps aux
最后的输出结果如下:
ps aux
命令默认会依照 PID 的顺序来排序显示,各字段的意义:
USER
:该进程的所属账号PID
:该进程的 ID%CPU
:该进程使用掉的 CPU 资源百分比%MEM
:该进程使用掉的物理内存百分比VSZ
:该进程使用掉的虚拟内存百分比RSS
:该进程占用的固定的内存量TTY
:该进程是在哪个终端上面运行,若果与终端无关则显示?
,如果为pts/0
等表示由网络连接进入主机的进程STAT
:该进程目前的状态(R/S/T/Z
)START
:该进程被触发启动的时间TIME
:该进程实际使用 CPU 运行的时间COMMEND
:该进程的实际命令是什么
造成僵尸进程的原因在于该进程应该已经执行完毕,或是应该要终止,当时该进程的父进程却无法完整地将该进程结束掉,而造成该进程一直存在内存当中,如果发现某个进程的
CMD
后面接上<deunct>
时,就表示该进程是僵尸进程,当发现僵尸进程时需要找出该进程的父进程
实际上,通常僵尸进程已经无法管理,直接交给 systemd 这个进程负责,而 systemd 是系统第一个执行的进程,即它是所有进程的父进程,因而无法杀掉该进程,所以如果产生僵尸进程,而系统过一阵子还没有通过内核非经常性的特殊处理来将该进程删除是,最好只好通过reboot
的方式来将该进程杀掉
2.1.2 top
命令
相对于 ps
选取一个时间点的进程状态,top
命令就可以持续地获取进程运行时的状态,它的语法如下:
top [-d 数字]
top [-bnp]
选项与参数:
-d
:后面可以接秒数,默认是5秒-b
:以批量的方式执行top
,通常搭配数据流重定向来使用-n
:与-b
搭配,意思是需要执行几次top
命令-p
:指定某些 PID 来查看
在 top
执行过程中可以使用到按键命令:
?
:显示在top
中可以输入的按键命令P
:以 CPU 的使用排序显示M
:以内存的使用排序显示N
:以 PID 来显示T
:有该进程使用的 CPU 时间累积(TIME+)排序显示k
:给予某个 PID 一个信号(Signal)r
:重设某个 PID 的 nice 值q
:退出top
top
命令的界面如下:
- 第一行分别显示的信息为:
- 目前的时间,如图即
top 04:47:43
- 开机到目前为止所经过的时间,即
up 12:15
- 已经登陆的用户人数,即
1 user
- 系统在 1、5、15 分钟的平均任务负载,系统平均要负责运行几个进程(任务)的意思,数值越小代表系统越闲置,数值高于1就要注意是否系统过于频繁了
- 目前的时间,如图即
- 第二行显示的是目前进程的总量与状态
- 第三行显示的是 CPU 的整体负载,值得注意的是
wa
项目,它表示I/O
,通常系统变慢都是I/O
产生的问题比较大 - 第四行与第五行,表示目前的物理内存与虚拟内存的使用情况,
swap
的使用量要尽量少,如果swap
的使用量大就表明了系统的物理内存不足 - 第六行是当
top
进程当中输入命令时,显示状态的地方:PID
:进程的 PIDUSER
:进程的所属用户PR
:进程的优先执行顺序NI
:与PR
有关%CPU
:CPU 的使用率%MEM
:内存的使用率TIME+
:CPU 使用时间的累积
top
命令默认使用 CPU 的使用率作为排序的依据
2.2 进程的管理
进程之间是可以互相控制的,进程是通过给予该进程一个信号(Signal)去告知该进程你想要它干什么,在上面讲述的 kill
命令就已经提及过信号(Signal),主要的信号的代码、名称及内容如下:
代号 | 名称 | 内容 |
---|---|---|
1 | SIGHUP | 启动被终止的进程,可让更该PID重新读取自己的配置文件,类似重启 |
2 | SIGINT | 相当于使用 [ctrl] + c 来中断进程的运行 |
9 | SIGKILL | 代表强制中断一个进程的执行,如果该进程执行到一半,那么还没完成的部分可能会有 半成品 产生,如 vim 的 .swp 文件 |
15 | SIGTERM | 以正常的方式来结束进程,如果此时该进程已经产生问题,使用这个信号就没有反应了 |
19 | SIGSTOP | 相当使用 [ctrl] + z 来暂停进程的运行 |
使用 kill
可以帮将信号传送给某个任务(%jobNumber
)或是某个 PID(直接输入数字),语法如下:
kill -Signal PID
eg:
kill -SIGINT 123
2.3 关于进程的执行顺序
上面介绍 top
命令时就提及到 Priority
和 nice
这两个字段信息,这两个信息就是与CPU的调度有关。
为了实现某些特定命令的优先执行,Linux给予进程一个优先级(Priority,PRI
),这个 PRI
数值越低代表越优先,不过要注意的是这个数值是由内核动态调整的,用户无法调整设置 PRI
值。
用户想要调整进程的优先级需要通过调整 nice
值(NI
值),NI
值是有正负的,当 NI
值为负数时,该进程就会降低 PRI
值,即变得较优先被处理。
NI
值的注意事项:
NI
值可调整的范围为-20 ~ 19
- root 用户可以随意地调整进程的
NI
值,范围为:-20 ~ 19
- 一般用户仅可以调整自身进程的
NI
值,而且范围为:0 ~ 19
,而且一般用户只能将NI
值调高而不能调低
给予某个进程的 NI
值有三种方式:
1、一开始执行进程就立即给予一个特定的 NI
值,使用 nice
命令,语法如下:
nice [-n 数字] command
2、调整某个已经存在的 PID 的 NI
值,使用 renice
命令,语法如下:
renice [number] PID
3、使用上述的 top
命令