【问题标题】:Call function to exit gracefully when script timeout reached脚本超时时调用函数优雅退出
【发布时间】:2019-09-06 10:46:06
【问题描述】:

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

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

结果应该是:

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

计时器应该用于整个脚本,而不仅仅是单个函数调用(给或花几微秒来设置计时器,这很好)

这似乎很简单,但我似乎找不到方法,我能找到的所有信息都是关于设置执行超时,在此之后脚本无法控制地退出,所以我无法向 Nagios 回复有超时。

有什么想法吗?谢谢。

【问题讨论】:

  • 看起来很简单。它不是。至少使用香草 PHP。你想要的是 Promises 和异步/并行处理。为此,您需要一个第三方库,例如 react (reactphp.org) 或 amp (github.com/amphp/amp)
  • 费了很大力气,可惜没有内置一些东西,但是感谢您提供的信息,我已将此添加到功能请求bugs.php.net/bug.php?id=27297

标签: php nagios


【解决方案1】:

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

在Linux下调用脚本

超时 --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");

显然定时器是可选的

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多