当进程终止时,命令返回退出代码2

时间:2015-09-30 01:58:07

标签: php command-line signals sigint pcntl

我有一个长期运行的PHP进程处理信号。信号在每次"迭代结束时处理。使用pcntl_signal_dispatch()以及其他一些任务。其中一些任务运行命令行操作,例如find

一旦进程收到SIGINT Ctrl + C ),无论是在进程处理信号之前还是之后,所有命令行操作开始失败并返回退出代码2.

发生了什么?我怀疑有什么方法可以解决它,但我想了解造成这个问题的原因。

编辑: 以下是重现此问题的代码示例:

echo "START\n";

$run = true;
pcntl_signal(SIGINT, function() use ($run) {
    $run = false;
});

while ($run) {
    $command = 'sleep 1 && find . -name "*.md"';
    exec($command, $result, $exitCode);

    if ($exitCode !== 0 || !isset($result[0])) {
        throw new \RuntimeException("Command failed with exit code '{$exitCode}'.");
    }

    pcntl_signal_dispatch();
}

echo "END\n";
die;

我完全无法让这个小脚本正确结束(使用echo "END\n"; die;);它总是以RuntimeException结尾。

好像信号也在中断从进程启动的命令。也许信号被发送到过程以及所有当前和未来的孩子?

如果是这样的话,我能做些什么来更好地处理这种情况吗?我可以设置一些"全球"变量表示信号已被捕获,并且该命令不应该从该点运行,但是这有点混乱,并且对于在信号和信号之间的间隔期间运行的命令不起作用。我打电话给pcntl_signal_dispatch()

0 个答案:

没有答案