1 回答

TA貢獻1866條經(jīng)驗 獲得超5個贊
這是來自Cmd.wait的文檔,重點是:
func (c *Cmd) Wait() error
Wait 等待命令退出并等待任何復制到 stdin 或從 stdout 或 stderr 復制完成。
這意味著它將等待所有進程關(guān)閉相關(guān)管道,而不僅僅是給定進程退出。當您在后臺啟動進程時,這是一個問題:
這是一個例子:
#!/bin/bash
sleep 3600 &
echo "Exit"
sleep繼承 stdin/out/err 并讓它們打開一個小時。它會在終端中立即退出,因為 Bash 不關(guān)心終端打開了什么:
$ ./testscript; echo "Returned"
Exit
Returned
$
但是,如果您通過管道傳輸?shù)絚at,它將等待所有潛在數(shù)據(jù)完成(以防萬一sleep決定稍后再寫一些東西),然后 bash 依次等待cat:
$ ./testscript | cat; echo "Returned"
Exit
(Hangs for an hour)
您可以通過確保任何分叉進程不會通過重定向到其他地方寫入管道來解決此問題:
#!/bin/bash
sleep 3600 < /dev/null > /dev/null 2>&1 &
echo "Exit"
由于sleep不再保持管道打開,它會立即返回,無論是在 shell 中還是在Cmd.Wait():
$ ./testscript | cat; echo "Returned"
Exit
Returned
- 1 回答
- 0 關(guān)注
- 169 瀏覽
添加回答
舉報