shell脚本进程终止问题

时间:2013-06-14 07:04:59

标签: shell signals sh shell-trap

/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脚本中的功能。

我想在某些特殊情况下称它为... 当:

  1. “kill -9”在此脚本的pid上触发
  2. “ctrl + z”在-x模式下运行时按下
  3. 服务器在脚本执行时重新启动..
  4. 简而言之,对于脚本中的任何一种中断,都应该做一些动作 例如。 rm -f /var/run/lockfile.pid 但我的上述功能不能正常工作;它仅适用于终端关闭或“ctrl + c”

    请不要建议升级“bash / sh”版本。

2 个答案:

答案 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文件并继续进行,就像它从未存在一样。如果旧进程都存在并且是正确的进程,则新进程应记录一条消息并退出。