
我有一個應用程式運作良好,當直接從終端運行時,帶或不帶“&”。但是,如果我嘗試從 shell 腳本執行它,則僅當跳過尾隨“&”時它才有效。因此,我無法從 shell 腳本內部在背景啟動此進程。
<Path to My application> <options> &
應用程式視窗打開,但此後沒有任何進展。
(該應用程式是(由我)修改的 qemu 0.13.0 版本。當我在 shell 腳本中在後台運行磁碟映像時,我遇到了黑屏問題)
答案1
當應用程式具有執行此操作的內建選項時,無需使用 & 符號將應用程式設定為背景。 qemu 就是這種情況(除非您將其刪除):
% qemu-kvm --help | grep daemon
-daemonize daemonize QEMU after initializing
答案2
您是否看到類似這樣的訊息
[1] suspended (tty output) myapplication
在終端?此訊息意味著您的程式正在嘗試從終端讀取(可能是因為它正在從標準輸入讀取)。由於只有前台程式可以從終端機讀取數據,因此該程式被掛起。
如果您看到此訊息,請找出您的程式正在讀取的原因。無奈之下,請嘗試重新導向其標準輸入 ( myapplication </dev/null
)。
如果您沒有看到這樣的訊息,則表示您的程式中存在其他錯誤。查看您的程式在調試器中或使用strace
.
答案3
從終端機執行後台命令和從 shell 腳本執行後台命令之間存在差異。
在非互動式 shell(停用作業控制)中,後台指令的 stdin 會從 隱式重新導向/dev/null
,這可能會導致您的指令完全不執行。
請參閱 POSIX 標準Shell 指令語言:非同步列表。
# compare where fd 0 is pointing to
sh -c 'sleep 10 & lsof -p ${!}'
sh -c 'sleep 10 0<&0 & lsof -p ${!}'
sh -c 'set -m; sleep 10 & lsof -p ${!}'
sh -ic 'sleep 10 & lsof -p ${!}'