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

时间:2014-12-26 19:21:57

标签: 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/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 processecho $?返回123而不是0

有人可以解释一下发生了什么,我怎样才能确保所有java进程都被成功杀死(如果pts/1还活着就可以了?)

2 个答案:

答案 0 :(得分:3)

正如您在第二个命令中看到的那样,grep javagrep进程本身匹配,因为它的参数中包含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,您可以使用pkillkillall,如果您的系统中有此pkill -u user_name -9 java ,那么这绝对是最佳选择,而不是更昂贵的渠道。

使用pkill

使用pkill,您可以向匹配模式的所有进程发送信号。

  

图案:
  指定用于匹配进程名称或命令行的扩展正则表达式。

pkill

注意:以前要执行pgrep,您可以使用pgrep -u user_name java

检查要杀死的pid

使用pgrep

获取pid

您可以首先使用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}}