我有一个正在尝试启动的脚本
php ./Script.php &
该任务进入后台但已停止。当我尝试使用 bg 运行它时,它只是保持停止状态。
$ jobs
[1]+ Stopped php ./Script.php
$ bg
[1]+ php ./Script.php &
[1]+ Stopped php ./Script.php
$
ps显示作业状态为T
$ ps ax | grep Script
951 pts/5 T 0:00 php ./Script.php
cat /proc/PID/wchan 显示“pipe_wait”
更新:
任何 PHP 脚本都会发生这种情况,甚至<?php sleep(1000)
;
更新:
感谢所有精彩的回答和评论。我现在明白为什么在技术层面上会发生这种情况,但我不确定某些版本的 PHP 是如何导致这种情况的。但是,这不是一个 *nix 问题。
答案1
几乎可以肯定,当终端不在前台进程组中时,该命令会尝试从终端读取数据。这将导致内核向进程发送 SIGTTIN,默认情况下会停止该进程。一个简单的测试是将 stdin 重定向到 /dev/null。如果进程在后台运行而没有停止,则问题是如上所述的 SIGTTIN。
答案2
如果确实不需要终端(或标准输入)输入,那么您可以执行以下操作:
php ./Script.php </dev/null &