在一台100多人使用的 SUN 服务器上常常发现有人滥用资源,平时用用就算了,到了交做业的时候100多号人同时登陆使用,服务器明显迟缓,特别是实验室用的是瘦客户机,没硬盘,SUN 客户端须要从服务器装载系统镜像,并且编译、运行程序都要在服务器上完成。若是发现某个用户运行不少进程,而且进程还有子进程,怎么能方便的找出所有进程 并 kill 掉呢? mysql
ps -ef | grep ^username | cut -c 10-15 | xargs kill -9 程序员
把所有进程打印出来根据用户名过滤后找出所有进程号,而后逐行 kill 掉。xargs 就是用来把 cut 后的输出逐个以空白符分割后输给 kill。注意上面的 grep ^username 不能缺 ^,^username 表示从一行开始匹配 username,好比就能够避免匹配到 sshd: username@pts/0。不过尽管加了 ^,上面的代码仍然有个小 bug,若是刚好有个进程名和用户名彻底同样怎么办?能够用 ps -u 找出全部与 username 相关的进程,而后 grep -v 过滤掉 PID 只剩下进程信息,而后逐行 kill 掉,以下: sql
ps -u username | grep -v PID | cut -c 0-5 | xargs kill -9 数据库
不过上面的命令还有个小问题就是若是 cut 的时候不当心 cut 多了或者 cut 少了怎么办?能够用 awk 过滤一列信息出来: 服务器
ps -u username | grep -v PID | awk '{print$1}'| xargs kill -9
上面的命令也能够在 Linux 上运行,不过在 Linux 下能够用更简单的 killall,Solaris 上没有 killall: ssh
killall -u username
一个小小的命令行反反复复改了屡次,更别说上百万行的代码了,写代码太容易引入 bug 了,这就是为何测试这么重要的缘由,我以为程序员应该用50%的时间写代码,50%的时间测代码;测试员也应该用50%的时间测代码,50%的时间写工具来自动测试代码。 工具
终止一个进程或终止一个正在运行的程序,通常是经过kill 、killall、pkill、xkill 等进行。好比一个程序已经死掉,但又不能退出,这时就应该考虑应用这些工具。 测试
应用的场合就是在服务器管理中,在不涉及数据库服务器程序的父进程的中止运行,也能够用这些工具来终止。为何数据库服务器的父进程不能用这些工具杀死呢?缘由很简单,这些工具在强行终止数据库服务器时,会让数据库产生更多的文件碎片,当碎片达到必定程度的时候,数据库就有崩溃的危险。好比mysql 服务器最好是按其正常的程序关闭,而不是用pkill mysqld 或killall mysqld 这样危险的动做;固然对于占用资源过多的数据库子进程,咱们应该用kill 来杀掉。
kill [信号代码] 进程ID
注:信号代码能够省略;咱们经常使用的信号代码是-9 ,表示强制终止; spa
对于僵尸进程,能够用kill -9 来强制终止退出;
好比一个程序已经完全死掉,若是kill 不加信号强度是没有办法退出,最好的办法就是加信号强度-9 命令行
killall 经过程序的名字,直接杀死全部进程
pkill 和killall 应用方法差很少,也是直接杀死运行中的程序;若是您想杀掉单个进程,请用kill 来杀掉。