一,Linux核心进程管理命令
1.1 ps:查看进程
1.1.1 命令解释
功能说明
ps命令用于列出执行ps命令的那个时刻的进程快照,就像用手机给进程照了一张照片。如果想要动态地显示进程,就需要使用top命令,该命令类似于把手机切换成录像模式。
选项说明
参数选项 | 解释说明(带@的为重点) |
---|---|
-a | 显示所有终端下执行的进程 |
a | 显示与终端相关的所有进程,包含每个进程的完整路径@ |
x | 显示与终端无关的所有进程@ |
u | 显示进程的用户信息@ |
-u | 显示指定用户相关的进程信息 |
-e | 显示所有进程@ |
-f | 额外显示UID,PPID,C与STIME栏位@ |
f | 显示进程树 |
-H | 显示进程树 |
-l | 以详细的格式来显示进程的状况 |
-o | 自定义输出指定的字段,以逗号分隔 |
-sort key | key表示为指定字段排序,默认升序,+key升序,-key降序 |
1.1.2 使用范例
(1)ps 命令不接任何参数
[root@Mr_chen ~]# ps
PID TTY TIME CMD
1135 pts/0 00:00:00 bash
1152 pts/0 00:00:00 bash
1162 pts/0 00:00:00 bash
1173 pts/0 00:00:00 bash
1182 pts/0 00:00:00 ps
默认情况下,ps命令不接任何参数时,输出的是使用者当前所在终端(窗口)的进程,其输出结果中的各项说明如下。
- [x] :PID是进程的标识号
- [x] :TTY是进程所属的终端控制台
- [x] :TIME列是进程所使用的总的CPU时间
- [x] :CMD列是正在执行的命令行
(2)ps -ef
[root@Mr_chen ~]# ps -ef # -e显示所有进程,-f格外显示UID,PPID,C与STIME栏位
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 15:00 ? 00:00:00 /sbin/init
root 2 0 0 15:00 ? 00:00:00 [kthreadd]
root 3 2 0 15:00 ? 00:00:00 [migration/0]
root 4 2 0 15:00 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 15:00 ? 00:00:00 [migration/0]
root 6 2 0 15:00 ? 00:00:00 [watchdog/0]
root 7 2 0 15:00 ? 00:00:00 [events/0]
root 8 2 0 15:00 ? 00:00:00 [cgroup]
root 9 2 0 15:00 ? 00:00:00 [khelper]
root 10 2 0 15:00 ? 00:00:00 [netns]
root 11 2 0 15:00 ? 00:00:00 [async/mgr]
root 12 2 0 15:00 ? 00:00:00 [pm]
root 13 2 0 15:00 ? 00:00:00 [sync_supers]
root 14 2 0 15:00 ? 00:00:00 [bdi-default]
root 15 2 0 15:00 ? 00:00:00 [kintegrityd/0]
root 16 2 0 15:00 ? 00:00:00 [kblockd/0]
root 17 2 0 15:00 ? 00:00:00 [kacpid]
输出信息中各列说明如下
- [x] UID:进程被该UID所拥有
- [x] PID:进程的标识号
- [x] PPID:进程的父进程的标识号
- [x] C:CPU使用的资源百分比
- [x] STIME:进程开始的时间
- [x] TTY:该进程是在哪个终端机上面运作,若与终端机无关,则显示“?”,另外,tty1-tty6是本机上面的登入者进程,若为pts/0等,则表示为由网络连接进主机的进程。
- [x] TIME:进程所使用的总的CPU时间
- [x] CMD:正在执行的命令行
(3)ps aux
[root@Mr_chen ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 19232 1488 ? Ss 15:00 0:00 /sbin/init
root 2 0.0 0.0 0 0 ? S 15:00 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 15:00 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S 15:00 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S 15:00 0:00 [migration/0]
root 6 0.0 0.0 0 0 ? S 15:00 0:00 [watchdog/0]
root 7 0.0 0.0 0 0 ? S 15:00 0:00 [events/0]
输出信息中各列的说明如下
- [x] USER:该进程属于的用户。
- [x] PID:该进程的进程号。
- [x] %CPU:该进程使用掉的CPU资源百分比。
- [x] %MEM:该进程所占用的物理内存百分比。
- [x] VSZ:该进程使用掉的虚拟内存量(单位Kbytes)
- [x] RSS:该进程占用的固定的内存量(单位Kbytes)
- [x] TTY:该进程是在哪个终端机上面运作的,若与终端机无关,则显示“?”,另外,tty1-tty6是本机上面的登入者进程,若为pts/0等,则表示为由网络连接进主机的进程。
- [x] STAT:该进程目前的状态,主要的状态包括如下几种。
- R:正在运行,或者是可以运行。
- S:正在终端睡眠中,可以由某些信号唤醒。
- D:不可中断睡眠。
- T:正在侦测或者是停止了。
- Z:已经终止,但是其父进程无法正常终止它,从而变成zombie(僵尸)进程的状态
- +:前台进程。
- l:多线程进程。
- N:低优先级进程。
- <:高优先级进程。
- s:进程领导者。
- L:已将页面锁定到内存中。
- [x] START:该进程被触发启动的时间
- [x] TIME:该进程实际使用CPU运作的时间
- [x] COMMAND:该进程的实际命令。
(4)显示指定用户的相关进程信息
[root@Mr_chen ~]# ps -u yunjisuan
PID TTY TIME CMD
1315 pts/1 00:00:00 bash
1335 pts/1 00:00:00 vim
(5) 以详细格式显示进程状态
[root@Mr_chen ~]# ps -u yunjisuan -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 500 1315 1314 0 80 0 - 27076 n_tty_ pts/1 00:00:00 bash
0 T 500 1335 1315 0 80 0 - 35884 signal pts/1 00:00:00 vim
输出信息中各列的说明如下
- [x] F:代表这个进程的标志(flag),4代表使用者为super user。
- [x] S:代表这个进程的状态(STAT),前面已经讲解过了
- [x] UID:进程被该UID所拥有。
- [x] PID:进程的标识号。
- [x] PPID:父进程的ID。
- [x] C:CPU使用的资源百分比。
- [x] PRI:Priority(优先执行序)的缩写
- [x] NI:Nice值
- [x] ADDR:指出该进程在内存的哪个部分。如果是个running的进程,则一般是“-”。
- [x] SZ:使用掉的内存大小。
- [x] WCHAN:目前这个进程是否正在运作当中,若为“-”则表示正在运作。
- [x] TTY:该进程是在哪个终端机上面运作的,若与终端机无关,则显示“?”,另外,tty1-tty6是本机上面的登入者进程,若为pts/0等,则表示为由网络连接进主机的进程。
- [x] TIME:该进程实际使用CPU运作的时间
- [x] CMD:该进程的实际命令
(6)查看某个进程在哪个CPU上运行
[root@Mr_chen ~]# ps -eo pid,args,psr
PID COMMAND PSR
1 /sbin/init 0 #CPU标记0代表第一个CPU
2 [kthreadd] 0
3 [migration/0] 0
4 [ksoftirqd/0] 0
5 [migration/0] 0
6 [watchdog/0] 0
7 [events/0] 0
8 [cgroup] 0
9 [khelper] 0
1.2 kill:终止进程
1.2.1 命令解释
功能说明
kill命令能够终止你希望停止的进程
选项说明
参数选项 | 解释说明(带@为重点) |
---|---|
-l | 列出全部的信号名称 |
-p | 指定kill命令只打印相关进程的进程号,而不发送任何信号 |
-s | 指定要发送的信号@ |
1.2.2 使用范例
(1)列出所有信号的名称
[root@Mr_chen ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
[root@Mr_chen ~]# kill -l kill #可以使用-l参数对信号名和数字信号互换
9
[root@Mr_chen ~]# kill -l 9
KILL
常用信号:
信号 | 说明 |
---|---|
HUP(1) | 挂起,通常因终端掉线或用户退出而引发 |
INT(2) | 中断,通常是按下Ctrl+c组合键来发出这个信号 |
QUIT(3) | 退出,通常是按下CTRL+组合键来发出这个信号 |
KILL(9) | 立即结束进程的运行 |
TERM(15) | 终止,通常在系统关机时发送 |
TSTP(20) | 暂停进程的运行,通常是按下Ctrl+z组合键来发出这个信号 |
(2)终止进程
- kill指令默认使用的信号为15,用于结束进程。如果进程忽略此信号,则可以使用信号9强制终止进程。
- 一般是先通过ps等命令获取到要终止进程的进程号,然后直接使用“kill 进程号”就可以了。
kill 2203 #kill 命令默认使用的信号为15,这种格式最常用、
kill -s 15 2203 #这种格式使用-s参数明确指定发送值为15的信号,效果和kill 2203一样
kill -15 2203 #上面的-s 15可以简写为-15
如果用上面的方法还是无法终止进程,那么我们就可以用KILL(9)信号强制终止进程。
kill -9 2203 #信号9会强行终止进程,这会带来一些副作用,如数据丢失,或者终端无法恢复到正常状态等,因此应尽量避免使用,除非进程使用其他信号无法终止。
(3)扩展:特殊信号0的应用案例
在kill的所有信号中,有一个十分特殊的信号值0,使用格式为kill -0 $pid。其中的-0表示不发送任何信号给$pid对应的进程,但是仍然会对$pid是否存在对应的进程进行检查,如果$pid对应的进程已存在,则返回0,若不存在则返回1。
[root@Mr_chen ~]# pgrep -l sshd
985 sshd
1131 sshd
[root@Mr_chen ~]# kill -s 0 985
[root@Mr_chen ~]# echo $?
0
[root@Mr_chen ~]# kill -s 0 986
bash: kill: (986) - No such process
[root@Mr_chen ~]# echo $?
1
应用:如果同学们想要写一个管理系统服务的脚本,则可以使用这个技巧。
1.3 killall:通过进程名终止进程
1.3.1 命令解释
功能说明:
使用kill命令终止进程还需要先获取进程的pid进程号,这个过程有点繁琐,而使用killall命令就可以直接用“kill 进程名”这种形式终止进程。
选项说明:
参数选项 | 解释说明(带@为重点) |
---|---|
-I | 不区分大小写匹配 |
-g | 终止属于该进程组的进程 |
-i | 在终止进程之前询问是否确认 |
-l | 列出所有已知的信号名 |
-q | 如果没有进程终止则不提示 |
-r | 使用正则表达式匹配要终止的进程名称 |
-s | 用指定的信号代替默认信号 |
-u | 终止指定用户的进程@ |
-v | 报告信号是否发送成功 |
-w | 等待所有被终止的进程死去。killall每秒都会检查一次被终止的进程是否仍然存在,其仅在都死光后才返回。注意,如果信号被忽略,或者没有起作用,或者进程停留在僵尸状态,那么killall可能会永久等待@ |
1.3.2 使用范例
(1)终止定时任务服务进程的例子
首先我们要知道定时任务的进程名是crond,终止该进程的命令如下:
[root@Mr_chen ~]# killall crond
[root@Mr_chen ~]# killall crond #用killall终止进程可执行多次
crond: no process killed #等看到这个结果说明进程死了
[root@Mr_chen ~]#
[root@Mr_chen ~]# /etc/init.d/crond start #启动服务
Starting crond: [ OK ]
[root@Mr_chen ~]# killall -w crond #使用-w参数,会看到等待几秒后结束命令操作
[root@Mr_chen ~]# killall -w crond
crond: no process killed
(2)终止指定用户的所有进程
[root@Mr_chen ~]# ps -u yunjisuan -l #查看普通用户的所有进程详细信息
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 500 1175 1174 0 80 0 - 27076 wait pts/1 00:00:00 bash
0 S 500 1210 1175 0 80 0 - 27076 n_tty_ pts/1 00:00:00 bash
0 T 500 1235 1210 0 80 0 - 35884 signal pts/1 00:00:00 vim
[root@Mr_chen ~]# killall -u yunjisuan vim #杀掉指定用户的vim进程
[root@Mr_chen ~]# ps -u yunjisuan -l #成功
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 500 1175 1174 0 80 0 - 27076 wait pts/1 00:00:00 bash
0 S 500 1210 1175 0 80 0 - 27076 n_tty_ pts/1 00:00:00 bash
特别提示:
这种方式可以终止所有归属于yunjisuan用户的vim进程。在之前,我在给同学们讲nginx优化时提到过nginx的监牢模式和在和给同学们讲解sudo时提到过企业的集权分治策略,他们都是利用普通用户来启动服务。此时,我们可以指定用户杀死该用户启动的某一服务的所有进程。
1.4 pkill:通过进程名终止进程
1.4.1 命令解释
功能说明:
pkill命令可通过进程名终止指定的进程。使用killall终止进程需要连续执行几次,而pkill可以杀死指定进程及其所有子进程。
选项说明:
参数选项 | 解释说明(带@为重点) |
---|---|
-t终端 | 杀死指定终端的进程@ |
-u用户 | 杀死指定用户的进程@ |
1.4.2 使用范例
(1)通过进程名终止进程
[root@Mr_chen ~]# /etc/init.d/crond status #查看定时任务程序运行状态
crond (pid 1274) is running...
[root@Mr_chen ~]# pkill crond #终止定时任务进程
[root@Mr_chen ~]# /etc/init.d/crond status
crond dead but subsys locked #进程被终止
(2)通过终端名终止进程
[root@Mr_chen ~]# w #第二列TTY就是用户运行的终端
15:57:09 up 1:05, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yunjisua tty1 - 15:55 12.00s 0.02s 0.01s vim ttt
root pts/0 192.168.200.1 14:51 0.00s 0.07s 0.00s w
root pts/1 192.168.200.1 15:19 3:28 0.01s 0.00s bash
[root@Mr_chen ~]# ps -u yunjisuan -l #查看用户的进程
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 500 1175 1174 0 80 0 - 27076 wait pts/1 00:00:00 bash
0 S 500 1210 1175 0 80 0 - 27076 n_tty_ pts/1 00:00:00 bash
4 S 500 1333 1322 0 80 0 - 27075 wait tty1 00:00:00 bash
0 S 500 1359 1333 0 80 0 - 35890 poll_s tty1 00:00:00 vim
[root@Mr_chen ~]# pkill -t tty1 #杀掉终端正在运行的进程
[root@Mr_chen ~]# ps -u yunjisuan -l #vim进程没了
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 500 1175 1174 0 80 0 - 27076 wait pts/1 00:00:00 bash
0 S 500 1210 1175 0 80 0 - 27076 n_tty_ pts/1 00:00:00 bash
4 S 500 1333 1322 0 80 0 - 27075 n_tty_ tty1 00:00:00 bash
[root@Mr_chen ~]# pkill -9 -t tty1 #强行杀掉tty1终端(踢掉用户)
[root@Mr_chen ~]# ps -u yunjisuan -l
F S UID PID