达到脚本超时后,调用函数会正常退出

时间:2019-09-06 10:46:06

标签: php nagios

我有一个通过Nagios调用的在PHP 5.5&PHP 7上通过CLI运行的PHP脚本,超时后Nagios在该脚本上运行了一个非常不友好的kill -9。

所以我希望用户能够在命令行上指定一个超时(我使用getopt抓取)来启动计时器,然后让脚本照常继续。

结果应为:

  1. 脚本运行时间过长,调用了一个函数以退出脚本并停止任何未完成的操作(例如,PDO DB查询花费的时间太长)
  2. 脚本在超时之前完成,脚本正常退出并取消了计时器

计时器应该用于整个脚本,而不仅仅是单个函数调用(允许或花费几微秒的时间来设置计时器就可以了)

这似乎很简单,但是我似乎找不到解决方法,我所能找到的所有信息都是围绕执行超时设置的,此后脚本无任何控制地退出,所以我无法向Nagios发出消息,超时。

有什么想法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

嗯,好吧,看来我唯一可以想到的方法就是这样(任何改进的建议都很好)

使用以下命令在Linux下调用脚本

  

timeout --signal = SIGHUP 120s script.php ....

在PHP脚本中放入以下内容:

// Protect from some causes of death
function sig_handler($sig) {
    echo "UNKNOWN, Script Dying: I was killed before the requested work could be completed.  (Execution Time " .
        round((microtime() - $GLOBALS['timer']),2) . " secs)" . PHP_EOL;
    exit (3);
}

// Start Timer
$timer = microtime(true);

// Catch Signals
pcntl_signal(SIGINT,  "sig_handler");
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP,  "sig_handler");

显然计时器是可选的