Job-Control
什麼會阻止任務在後台執行?
我有一個要啟動的腳本
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 &