了解LINUX或AIX系统上的pts/1服务

了解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

我试图杀死由特定用户运行的所有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
在那之后我做了什么?它返回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