我正在尝试杀死特定用户运行的所有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
还活着就可以了?)
答案 0 :(得分:3)
正如您在第二个命令中看到的那样,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
命令,这些命令允许您按名称终止进程,因此您不需要自己编写代码。
答案 1 :(得分:1)
建议使用@Barman,您可以使用pkill
或killall
,如果您的系统中有此pkill -u user_name -9 java
,那么这绝对是最佳选择,而不是更昂贵的渠道。
pkill
使用pkill
,您可以向匹配模式的所有进程发送信号。
图案:
指定用于匹配进程名称或命令行的扩展正则表达式。
pkill
注意:以前要执行pgrep
,您可以使用pgrep -u user_name java
pgrep
您可以首先使用pgrep
检查匹配的 pid,如下所示:
xargs
如果您不关心性能(为什么不关心?),您可以管道这些pid,并像pgrep -u user_name java | xargs kill -9
一样向他们发送信号:
kill -9 $(pgrep -u user_name java)
或者您可以对Command Substitution执行相同操作:
pkill
killall
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
fi
语句中:
{{1}}