我不知道大家,反正我工作中经常遇到开一个进程然后不知什么原因进程各种情况死在那里的情况(大部分distributed/multithreading程序不成熟的时候。。。)总之这个时候要做的就是把程序找到并关掉。所以这里小记一下需要的命令: ps 和 kill.
声明:这里的执行全都来自于Linux Containers,学习linux命令如果没有linux会很无聊的,现在container到处都是,上面那个就可以面试使用 :)
ps(1) - Linux manual page
ps就是用来查看进程,其中 -u 是针对user的选项,我们可以看到它提供了更多的信息 (UER, %CPU等);-x 包含了那些没有tty的进程,所以有更多的返回结果。
root@tryit-ample:~# ps
PID TTY TIME CMD
92 pts/1 00:00:00 bash
170 pts/1 00:00:00 ps
root@tryit-ample:~# ps -au
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 92 0.0 0.7 11560 3988 pts/1 Ss 21:48 0:00 bash
root 172 0.0 0.6 13212 3272 pts/1 R+ 21:51 0:00 ps -au
root@tryit-ample:~# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 1.9 20616 9868 ? Ss 21:48 0:00 /sbin/init
root 74 0.0 15.1 1539372 75668 ? Ssl 21:48 0:00 /usr/bin/lxd --group lxd --logfile=/var/log/lxd/lxd.log
root 92 0.0 0.7 11560 3988 pts/1 Ss 21:48 0:00 bash
root 169 0.0 0.7 13408 3600 pts/1 R+ 21:49 0:00 ps -aux
kill(1) - Linux manual page
kill 以及 pkill可以杀死进程,其实常用的kill -9是真正意义上的杀死进程,还有个很有好的kill -1 是结束进程,我没仔细看过,但猜想是给进程send a term signal。kill的用法是后面接pid, 以杀死进程对应的进程的pid。
可以看到-15杀死好像什么都没发生过,因为end a bash process确实没什么关系,bash进程结束,但terminal还在,bash只要自己处理一下自己即可,再ps一下,发现这个bash进程还在。但如果是-9, 不好意思,那个terminal也一起没了,因为立即杀死了bash进程。顺便提一下,这里也能发现用container的方便,terminal没有重启一下就是了,比重启电脑或着虚拟机实在是方便太多。
最后再说一下pkill,它是一个接受pattern的kill。它不需要pid,最后放一个常用的例子杀死某user的所有进程。这个命令配合-9是杀死所有进程的,所以要谨慎。我自己是经历过杀死所有进程然后调不出需要的background process的情况的。。。
root@tryit-valued:~# kill -15 92
root@tryit-valued:~#
root@tryit-valued:~# kill -9 92
root@tryit-valued:~# pkill -15 -u `id -u root`
root@tryit-valued:~#