我有一个长期运行的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()
。