だから、IPC メッセージをリッスンするこの PHP デーモン ワーカーがあります。奇妙なことに、親プロセス (pcntl_fork からの結果) は、子プロセスが完了するまで [php] < defunct> プロセスを残しますが、スクリプトがコマンドラインから直接ではなく、cronjob から開始された場合のみです。
< defunct> プロセスが悪意を持っていないことは知っていますが、cron ジョブから実行しているときにのみ発生する理由がわかりません。
指示
/path/to/php/binary/php /path/to/php/file/IpcServer.php
分岐コード:
$iParent = posix_getpid();
$iChild = pcntl_fork();
if ($iChild == -1)
throw new Exception("Unable to fork into child process.");
elseif ($iChild)
{
echo "Forking into background [{$iChild}].\n";
Log::d('Killing parent process (' . $iParent. ').');
exit;
}
出力
Forking into background [20835].
Killing parent process (20834).
ps補助 | grep php
root 20834 0.0 0.0 0 0 ? Zs 14:28 0:00 [php] <defunct>
root 20835 0.0 0.2 275620 8064 ? Ss 15:35 0:00 /path/to/php/binary/php /path/to/php/file/IpcServer.php
これは apache の既知のバグであることがわかりましたが、なぜ cronjob から実行するとこのバグが発生するのでしょうか?