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
ますか?