为什么我的 kill .sh 脚本有时不能杀死预期的进程?

Why does my kill .sh script sometimes not kill the intended processes?

我有一个 .sh 脚本,它调用许多其他 .sh 脚本并将它们写入日志文件,并在后台运行它们:

startMyProg.sh:

#!/bin/bash

./MyProg1.sh | tee /path/to/log/prog1_`date +\%Y\%m\%d_\%H\%M\%S`.log &
./MyProg2.sh | tee /path/to/log/prog2_`date +\%Y\%m\%d_\%H\%M\%S`.log &
./MyProgN.sh | tee /path/to/log/progN_`date +\%Y\%m\%d_\%H\%M\%S`.log &

我还有一个简单的帮助程序脚本,可以终止名称中包含 MyProg 的所有进程:

killMyProgs.sh:

#!/bin/bash
kill $(ps aux | grep MyProg | awk '{print }')

这个系统通常可以工作,但有时 killMyProg.sh 脚本不会终止它使用 ps|grep|awk 模式找到的进程。真正让我陷入循环的部分是,当我遇到 .sh 脚本没有终止进程的实例时,我可以调用 kill $(ps aux | grep MyProg | awk '{print $2} ') 直接从命令行执行,它将执行我期望的操作!我的方法中是否缺少某些东西?是否有任何有用的调试技术可以帮助我弄清楚为什么我的 .sh 脚本没有终止进程,但从命令行调用确切的命令却可以?

一些可能相关的细节: “./MyProgN”脚本是调用以使用不同的输入启动相同的 MyProg.jar 文件。所以“MyProg”的 ps|grep 显示了 .sh 脚本和它们启动的 java 应用程序并杀死了所有这些。

使用 RHEL7

测试几次 运行:

 ps aux | grep MyProg | awk '{print }'

您会注意到有时 grep 命令出现在 MyProg

之前

有时 grep 命令出现在 MyProg 之后(取决于 pid)。

因为 grep 命令也在 ps aux 中列出。

因此有时您的脚本会杀死第一个 grep 命令而不是您的命令。

最简单的解决方案是使用 pkill 命令。

  pkill -9 -f MyProg