了解LINUX或AIX系统上的pts/1服务
我试图杀死由特定用户运行的所有java进程。然后我想检查是否所有java服务都已成功停止,并在此基础上执行某些步骤。在我的脚本中,我使用了了解LINUX或AIX系统上的pts/1服务,linux,bash,shell,Linux,Bash,Shell,我试图杀死由特定用户运行的所有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
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
在那之后我做了什么?它返回0。接下来,我试图通过执行以下命令终止java服务:
ps -fu user_name | grep java | awk '{print $2}' | xargs kill -9
它给出了kill 32230:没有这样的过程。回声$?返回123而不是0
有人能解释一下发生了什么,我如何确保所有java进程都被成功终止?如果pts/1处于活动状态,这没问题?正如您在第二个命令中看到的,grep java正在匹配grep进程本身,因为它的参数中包含java。但是当杀戮开始的时候,格雷普已经完成了,所以你不能杀戮它 有两种常见的解决方法。一个是过滤掉grep: 另一个是使用技巧:
ps -fu user_name | grep '[j]ava` | awk '{print $2}' | xargs kill -9
这会阻止grep命令自身匹配,因为参数包含额外的[]字符,因此它与模式不匹配
请注意,大多数Linux发行版都有killall和/或pkill命令,允许您按名称终止进程,因此您不需要自己编写代码。正如建议的那样,您可以使用pkill或killall,如果您的系统中有pkill或killall,这肯定是最好的选择,而不是更昂贵的管道
使用
使用,您可以向与模式匹配的所有进程发送信号
模式:
指定用于与进程名称或命令行匹配的扩展正则表达式
注意:在执行pkill之前,您可以使用pgrep检查要终止的PID
和你的朋友在一起
您可以首先使用以下方法检查匹配的PID:
pgrep -u user_name java
如果您不关心性能,为什么不呢?您可以通过管道传输这些PID,并使用xargs向它们发送信号,就像您所做的那样:
pgrep -u user_name java | xargs kill -9
或者,您也可以对以下各项执行相同的操作:
使用
除了pkill,您还可以使用。默认情况下,killall与扩展正则表达式中的名称不匹配,pkill也不匹配。因此,如果要模拟更接近pkill的行为,必须指定-r选项:
检查成功
假设您选择pkill向进程发送信号。如果要在命令成功后执行某些步骤,只需将其放入If语句中:
if pkill -u user_name -9 java; then
step_1
step_2
fi
有什么答案对你有帮助吗?如果您需要更多帮助,请告诉我。谢谢您的跟进。我不能按照要求在我的脚本中使用pkill或killall,所以我使用的是ps-fu user|u name | grep java | grep-v grep | awk{print$2}| xargs kill-9,这是@Barmar推荐的。
pgrep -u user_name java | xargs kill -9
kill -9 $(pgrep -u user_name java)
killall -r -u user_name -9 java
if pkill -u user_name -9 java; then
step_1
step_2
fi