我正在尝试使用 bash 脚本编写程序。我想在这个程序被杀死时发出警报。
所需的操作是这样的:
#!/bin/bash
... # The original program
if killed ; do
echo "trying to kill the demo program ... "
sleep 5s
echo "demo program killed"
fi
如果您希望信号仅传递给正在运行的程序,而不是传递给运行脚本的 shell,那么基本概要可能是:
#!/bin/bash
set -euo pipefail
sleep 1 & # The original program
pid="$!"
kill -9 "$pid" # Pick your lethal signal
wait -n "$pid" && status=0 || status="$?"
((status > 128)) && echo "${pid} got signal $((status - 128))" 1>&2 || :
大概,这里^^^我们在后台运行程序,这样我们就可以kill从同一个片段中向它发送信号。在实践中,您可能会在前台运行它,然后检查它的$?返回状态而不是来自wait -n.
如果终止信号被传递到您的整个进程组,包括运行脚本的 shell,那就是另一回事了。特别是对于信号KILL( 9),没有办法屏蔽或报告它。当外壳得到它时,它就死了。对于其他信号,您可以设置一个trap命令(请参阅man bash其语法)以在脚本中优雅地处理信号,同时仍然能够检测并报告子进程因信号而死亡。