Job-Control

什麼會阻止任務在後台執行?

  • August 28, 2014

我有一個要啟動的腳本

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 問題。

幾乎可以肯定,當命令不在前台程序組中時,它會嘗試從終端讀取。這將導致核心向程序發送 SIGTTIN,預設情況下這將停止程序。一個簡單的測試是將標準輸入重定向到 /dev/null。如果該程序在後台執行而沒有停止,那麼問題就是所描述的 SIGTTIN。

如果確實需要 NO 終端(或標準輸入)輸入,則可以執行以下操作:

php ./Script.php </dev/null &

引用自:https://unix.stackexchange.com/questions/152515