什么会阻止任务在后台运行?

什么会阻止任务在后台运行?

我有一个正在尝试启动的脚本

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 &

相关内容