我正在尝试在 PHP CLI 脚本中调用一个长时间运行的 shell 命令exec()
。但我无法终生弄清楚如何中断 PHP 脚本并杀死生成的子进程。好像我一打电话exec()
,我的信号处理程序就被忽略了。以下代码按我的预期工作;如果我向进程发送 SIGTERM,它会SIGTERM
立即回显并退出。
<?php
declare(ticks = 1);
function sig_handler($signo) {
switch ($signo) {
case SIGTERM:
echo 'SIGTERM' . PHP_EOL;
flush();
break;
default:
}
}
pcntl_signal(SIGTERM, 'sig_handler', false);
sleep(60);
?>
但是,如果我替换sleep(60);
为exec('sleep 60');
,则在睡眠结束之前我不会到达我的信号处理程序。我有两个问题:
- 如何获得信号以使用
exec
(或shell_exec
或proc_open
)? - 捕获信号后,如何杀死由 产生的任何子进程
exec
?