0
/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

The above is my function in shell script.

I want to call it in some special conditions...like when:

  1. "kill -9" fires on pid of this script
  2. "ctrl + z" press while it is running on -x mode
  3. server reboots while script is executing ..

In short, with any kind of interrupt in script, should do some action eg. rm -f /var/run/lockfile.pid but my above function is not working properly; it works only for terminal close or "ctrl + c"

Kindly don't suggest to upgrade "bash / sh" version.

4

2 回答 2

1

SIGKILL 不能被trap命令或任何进程捕获。这是一个有保证的杀戮信号,根据它的定义,它不能被捕获。因此升级你sh/bash无论如何都不会工作。

于 2013-06-14T07:16:04.553 回答
1

你不能抓住kill -9它的全部意义,以暴力破坏不响应其他信号的进程(有一个解决方法,见下文)。

服务器重新启动应该首先向您的脚本传递一个信号,该信号应该被您所拥有的内容捕获。

至于 CTRL-Z,它也会SIGSTOP从内存中给你一个信号,所以你可能想要添加它。虽然这通常不会成为关闭进程的理由,因为它可能会被置于后台并重新启动(使用bg)。


至于在没有可捕获信号的情况下进程终止的情况(如-9案例),程序应在启动时检查该情况。

我的意思是lockfile.pid应该存储创建它的进程的实际 PID(echo $$ >/var/run/myprog_lockfile.pid例如通过使用),如果你尝试启动你的程序,它应该检查该进程的存在。

如果进程不存在,或者它存在但不是正确的(通常基于名称),您的新进程应该删除 pidfile 并继续进行,就好像它从未存在过一样。如果旧进程同时存在并且是正确的,那么您的新进程应该记录一条消息并退出。

于 2013-06-14T07:16:38.320 回答