为什么我的 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
我有一个 .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