当我们打开一个终端,用nohup运行vdbench程序。断开连接后,你发现你写的配置文件有误,想关闭已有的vdbench进程。你重新连接上终端,咦,我的jobs命令怎么没有显示我的nohup任务呢?这是因为你的nohup任务的sh进程的父进程为你的shell进程。而关闭该shell进程后,你的sh进程成为了孤儿进程,其父进程也就成了systemd进程。。。而众所周知,vdbench还会调用JVM。多个vdbench进程可能有多个JVM运行。
怎么办?怎么办?怎么办?
我的经验:
首先,利用ps进程树查看进程的PGID(Process Group ID)。然后kill掉整个进程组。
ps -ejH
嘿嘿找到了。给大家说一下,第1列是PID,第2列是PGID,第3列是SID。(分别是进程ID、进程组ID、会话IP)。我们发现所有vdbench和java进程都包含相同的PGID。要是能直接kill掉所有的进程就好了。诶还真有。
kill -9 -226932
第一个-9是UNIX中的杀掉进程的意思。等同于-SIGKILL。
第二个-226932是杀掉进程组ID为226932的所有进程。千万不要少了前面的负号(-)。有了负号代表进程组,没有负号代表进程哦。
棒棒,现在检查vdbench和java进程。
[root@node1 ~]# ps -e | grep vdbench
[root@node1 ~]# ps -e | grep java
没了,啥也没了。哈哈,强。