我正在尝试杀死由特定用户运行的所有java进程。然后,我想检查是否所有的java服务都已成功停止,并在此基础上执行某些步骤。在我的脚本中,我使用
ps -fu user_name | grep java | awk '{print $2}' | xargs kill -9`并检查echo $?是否返回0。
我尝试在Linux/AIX服务器上手动运行以下命令:
ps -fu user_name | grep java然后它又回来了
user_name 31970 31630 0 11:06 pts/1 00:00:00 grep java之后我做了echo $?,它返回了0。接下来,我尝试通过执行以下命令来终止java服务:
ps -fu user_name | grep java | awk '{print $2}' | xargs kill -9它给了kill 32230: No such process。echo $?返回123而不是0。
有人能解释一下这是怎么回事吗?我怎样才能确保所有的java进程都被成功地杀死了(如果pts/1还活着也没问题)?
发布于 2014-12-27 03:37:18
正如您在第二个命令中看到的,grep java与grep进程本身匹配,因为它的参数中包含java。但是当kill运行的时候,grep已经结束了,所以你不能杀死它。
有两种常见的方法来解决这个问题。一种是过滤掉grep
ps -fu user_name | grep java | grep -v grep | awk '{print $2}' | xargs kill -9另一种是使用一个技巧:
ps -fu user_name | grep '[j]ava` | awk '{print $2}' | xargs kill -9这会阻止grep命令匹配自身,因为参数包含额外的[]字符,所以它不匹配模式。
注意,大多数Linux发行版都有killall和/或pkill命令,这些命令允许您按名称终止进程,因此您不需要自己编写这些命令。
发布于 2014-12-27 06:36:49
正如@Barman建议的那样,你可以使用pkill或killall,如果你的系统中有它,那肯定是最好的选择,而不是更昂贵的管道。
使用pkill
使用pkill,您可以向所有匹配模式的进程发送信号。
模式:
指定用于匹配进程名称或命令行的扩展正则表达式。
pkill -u user_name -9 java注意:在执行pkill之前,您可以使用pgrep检查要终止的pids
使用pgrep获取pids
您可以先用pgrep查看匹配的pids,检查步骤如下:
pgrep -u user_name java如果您不关心性能(何乐而不为呢?),您可以通过管道传输这些pids,并使用xargs向它们发送信号:
pgrep -u user_name java | xargs kill -9或者,您也可以使用Command Substitution执行相同的操作
kill -9 $(pgrep -u user_name java)使用killall
除了pkill,您还可以使用killall。默认情况下,killall不像pkill那样通过扩展正则表达式匹配名称。因此,如果您想模拟更接近pkill的行为,则必须指定-r选项:
killall -r -u user_name -9 java检查成功
假设您选择pkill向进程发送信号。如果您想在命令成功后执行某些步骤,只需将其放入一条if语句中:
if pkill -u user_name -9 java; then
step_1
step_2
fihttps://stackoverflow.com/questions/27661053
复制相似问题