Linux进程管理
简介
-
在Linux系统当中,触发任何一个事件时,系统都会将它定义成为一个进程,并给予这个进程一个ID,称为PID,同时依据启发这个进程的使用者与相关属性关系,给予这个PID一组有效的权限设置
-
在Linux中,每一个程序都有一个自己的进程,每一个进程都有一个ID号
-
每一个进程,都有一个父进程
-
进程可以有两种存在方式:前台和后台。一般情况下,服务都是在后台运行的,基本的程序都是前台运行的
查看进程
静态查看进程
ps
命令将某个时间点的程序运行情况截取下来
仅查看自己的bash相关进程
root@TNTksals:~# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 7062 7056 0 80 0 - 5285 - pts/2 00:00:00 bash
0 R 0 7105 7062 0 80 0 - 7466 - pts/2 00:00:00 ps
- F:代表这个进程标识(process flags),说明这个程序的总体权限。若为4表示此程序的权限为root;若为1则表示此子程序仅进行负责(fork)而没有实际执行(exec)
- S:代表这个进程的状态(STAT),主要状态有:
- R:该程序正在运行中
- S:该进程目前正在睡眠状态(idle),但可以被唤醒(signal)
- D:不可被唤醒的睡眠状态,通常这支进程可能在等待I/O的情况
- T:停止状态,可能是在工作控制(背景暂停)或除错(traced)状态
- Z:僵尸状态,进程已经终止但却无法被移除至内存外
- UID/PID/PPID:此进程被该UID所有/进程的PID号/此进程的父进程的PID号
- C:代表CPU使用率,单位为百分比
- PRI/NI:Priority/Nice的缩写,代表此进程被CPU所执行的优先顺序,数值越小代表该进程越快被执行
- ADDR/SZ/WCHAN:都与内存有关。ADDR是 kernel function,指出该进程在内存的哪个部分,如果是个 running 进程,一般就会显示 “-”;SZ代表此进程占用的内存;WCHAN表示目前进程是否在运行中,同样的,若为 “-” 表示正在运行中
- TTY:运行该进程的终端机的位置。若与终端机无关则显示 ?;另外 tty1 ~ tty6 是本机上面的登录者程序;若为 pst/0 等等的,则表示由网络连接进主机的程序
- TIME:使用掉的CPU时间,注意,是此进程实际花费CPU运行的时间,而不是系统时间
- CMD:就是 command 的缩写,造成此进程的触发程序之指令
查看系统所有进程
root@TNTksals:~# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 56972 6672 ? Ss Aug10 0:01 /sbin/init noibrs
root 2 0.0 0.0 0 0 ? S Aug10 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Aug10 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< Aug10 0:00 [kworker/0:0H]
......
root 7062 0.0 0.2 21140 4896 pts/2 Ss 12:40 0:00 -bash
root 7077 0.0 0.0 0 0 ? S 12:41 0:00 [kworker/u4:1]
root 7097 0.0 0.0 0 0 ? S 12:45 0:00 [kworker/0:1]
root 7100 0.0 0.0 0 0 ? S 12:45 0:00 [kworker/1:0]
root 7119 0.0 0.1 38304 3360 pts/2 R+ 13:15 0:00 ps aux
- USER:该进程所属的用户
- PID:该进程的标识码
- %CPU:该进程占用的CPU资源
- %MEN:该进程所占用的实体内存
- VSZ:该进程使用掉的虚拟内存量(KB)
- RSS:该进程占用的固定的内存量(KB)
- TTY:同上
- STAT:该进程目前的状态。状态显示同上
- START:该进程被触发启动的时间
- TIME:同上
- COMMAND:该进程的实际指令
动态查看进程
top
命令可以持续侦测程序运行的状态
- 在
top
执行过程当中可以使用的按键指令:- ?:显示在
top
当中可以输入的按键指令 - P:以CPU的使用资源排序显示
- M:以内存的使用资源排序显示
- N:以PID来排序
- T:由该进程使用的CPU时间累积排序
- ?:显示在
管理进程
介绍
-
进程之间是可以相互控制,我们可以通过给予该进程一个讯号(signal)去告知该进程你想要让它做什么
-
可以使用
kill -l
查询所有的讯号(signal)
-
主要的讯号代号与名称对应及内容是:
代号 名称 内容 1 SIGHUP 启动被终止的进程,可让该PID重新读取自己的配置文件,类似重新启动 2 SIGINT 相当于用键盘输入 Ctrl-c 来中断一个进程的进行 9 SIGKILL 代表强制中断一个进程的进行,如果该进程进行到一半,那么尚未完成的部分可能会有”半产品“产生,类似vim会有.filename.swp保留下来 15 SIGTERM 以正常的结束程序来结束该进程。由于是正常的终止,所以后续的动作会将它完成。不过,如果该进程已经发生问题,就是无法使用正常的方法终止时,输入这个signal也是没有用的 19 SIGSTOP 相当于用键盘输入 Ctrl-z 来暂停一个进程的进行
结束进程
-
结束指定进程
kill -signal PID
-
结束指定名字的进程及其所有子进程
killall -signal 指令名称
例如,可以用
killall -9 httpd
杀死所有以httpd启动的进程
注意,只有第9种信号(SIGKILL)才可以无条件终止进程,其他讯号进程都有权利忽略
拾遗
僵尸进程
- 通常,造成僵尸进程的原因是因为该进程应该已经执行完毕,或者是因故应该要终止了,但是该进程的父进程却无法完整的将该进程结束掉,而造成那个进程一直存在内存当中
- 如果发现在某个程序的 CMD 后面还接上 <defunct> 时,就代表该进程是僵尸进程
- 事实上,通常僵尸进程都已经无法管控,而是直接交给 systemd 这个进程来负责了,而 systemd 是Linux内核主动调用的第一个进程,它是所有进程的父进程,我们无法杀掉该进程(杀掉它,系统就死掉了!)
- 所以,如果产生僵尸进程,而系统过一阵子还没办法通过内核非经常性的特殊处理来将该进程删除时,那只好通过
reboot
的方式来将该进程抹去了