【发布时间】:2010-07-16 21:05:38
【问题描述】:
我有一个 PHP 脚本必须使用 exec 在后台启动第二个脚本。父脚本需要捕获这个新进程的 PID,但我还需要捕获子脚本的任何潜在输出,以便将其记录到数据库中。我不能只将子脚本记录到数据库中,因为我还需要捕获致命错误或任何可能表明脚本存在问题的内容。使用 PID 是因为父进程需要能够检查子进程并查看它何时完成。子进程有时会作为 crons 运行,因此这里也不能选择分叉。如果有问题,我不希望有两个执行路径来调试。
这是我的第一个解决方案,它可以捕获输出,但无法获得正确的 PID。
// RedirectToLog.php just reads stdin and logs it to the databse.
$cmd="php child.php </dev/null 2>&1 | php RedirectToLog.php >/dev/null 2>&1 & echo $!";
这里的问题是 $!是在后台启动的最后一个进程的 PID,它最终是 RedirectToLog.php 而不是 child.php。
我的另一个想法是尝试使用 FIFO 文件(管道)。
$cmd1="php RedirectToLog.php </tmp/myFIFO >/dev/null 2>&1 &"
$cmd2="php child.php </dev/null >/tmp/myFIFO 2>&1 & echo $!"
这个不起作用,因为我无法让 RedirectToLog 可靠地使用 fifo,当它这样做时,有时 child.php 无法将 EOF 写入管道,导致两端都在等待另一端,两个进程都会挂起直到一个人被杀。
【问题讨论】: