/bin/sh -version
GNU sh, version 1.14.7(1)
exitfn () {
# Resore signal handling for SIGINT
echo "exiting with trap" >> /tmp/logfile
rm -f /var/run/lockfile.pid # Growl at user,
exit # then exit script.
}
trap 'exitfn; exit' SIGINT SIGQUIT SIGTERM SIGKILL SIGHUP
以上是我在shell脚本中的功能。
我想在某些特殊情况下称它为... 当:
简而言之,对于脚本中的任何一种中断,都应该做一些动作
例如。 rm -f /var/run/lockfile.pid
但我的上述功能不能正常工作;它仅适用于终端关闭或“ctrl + c”
请不要建议升级“bash / sh”版本。
答案 0 :(得分:1)
SIGKILL不能被trap
命令或任何进程捕获。它是一种保证的杀戮信号,它的定义不能被困。因此升级sh
/ bash
无论如何都无法正常工作。
答案 1 :(得分:1)
你无法捕捉kill -9
这就是它的全部要点,以摧毁那些不响应其他信号的过程(有一种解决方法,见下文)。
服务器重启应首先向您的脚本发送一个信号,该信号应该被您拥有的信息捕获。
对于CTRL-Z,它还会从内存中为您提供信号SIGSTOP
,因此您可能需要添加它。虽然这通常不是关闭您的流程的理由,因为它可能会被放入后台并重新启动(使用bg
)。
对于那些你的进程在没有可捕获信号的情况下死亡的情况(如-9
情况),该程序应该在启动时检查它。
由此,我的意思是lockfile.pid
应该存储创建它的进程的实际PID(例如,使用echo $$ >/var/run/myprog_lockfile.pid
),如果你尝试启动你的程序,它应该检查存在这个过程。
如果进程不存在,或者它存在但不是正确的(通常基于名称),则新进程应该删除pid文件并继续进行,就像它从未存在一样。如果旧进程都存在并且是正确的进程,则新进程应记录一条消息并退出。