【发布时间】:2015-06-13 12:29:38
【问题描述】:
我目前正在构建一个 Laravel 应用程序,它应该启动外部进程,然后使用进程 ID 监控它们的状态。
进程是这样启动的,返回 pid:
exec('nohup <script> & echo $!');
这很好用。但是现在我在跟踪新启动进程的状态时遇到了问题,大概是因为我使用的方法要求被检查的进程是执行命令的 shell 的子进程。
目前我尝试通过以下方式确定进程是否仍在运行:
exec("ps -p $pid -o pid=") == $pid;
如果进程仍在运行但仅适用于子进程,则返回true。我应该可以在这里改用kill -0 <pid>,所以这不是什么大问题。
是什么,不过,问题在于确定进程的退出代码。我当前的代码如下所示:
exec("wait $pid; echo \$?");
当进程完成时,wait 应该立即返回并将退出代码写入$?。但是这个也只适用于执行原始命令的shell的子进程,所以我总是得到退出代码127(不是这个shell的子进程)。
还有其他方法可以获取进程的退出码吗?
另外,我使用相同的 Laravel 队列来启动和监视进程(使用 php artisan queue:listen 命令),所以 exec() 方法 在同一个进程中被调用。还是 PHP 会为每个 exec() 调用启动一个单独的 shell?
编辑:我现在知道 Laravel 确实为每个排队的命令启动一个新进程,因此启动脚本和监控它们的状态是在不同的进程中完成的。
【问题讨论】: