PHPCLIスクリプト内で。を使用して長時間実行されるシェルコマンドを呼び出そうとしています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');、スリープが終了するまでシグナルハンドラに到達しません。2つの質問があります:
execシグナルを(またはshell_execまたは)で動作させるにはどうすればよいproc_openですか?- シグナルをトラップしたときに、によって生成された子プロセスをどのように強制終了でき
execますか?