在互動式 bash 中執行此命令:
$ timeout 1 sleep 2; echo $?
124
回報1241 秒後,如預期並如超時 (1) 所述。
但是,如果我運行與 cron 作業相同的操作,或者如果我將其作為命令字串提供給 bash,則它不會:
$ bash -c "timeout 1 sleep 2; echo $?"
0
加到-i
bash 呼叫沒有幫助,使用--foreground
timeout(1) 參數也沒有幫助。我也對 ksh 和 zsh 進行了相同的嘗試,但總是得到相同的結果,所以我想這一定是 timeout(1) 工作方式固有的東西。
我在網上搜尋了一下,發現這可能與訊號如何透過進程組進行有關,但我找不到如何讓超時在非互動式情況下按預期工作的解決方案。
關於我如何實現這一目標有任何提示嗎?最終我想要的是在 cron 中運行一個可能永遠阻塞的命令,並且我想可靠地檢測到這種情況。
答案1
由於雙引號,$?
正在擴展前bash 指令被呼叫。它正在被退出狀態所取代以前的命令(這是第一個exit $?
)
快速演示
bash -c 'exit 42'
bash -c "timeout 1 sleep 2; echo $?" # => 42
解決方案是使用單引號這樣目前的互動式 bash 程序就不會擴展該變數
bash -c 'timeout 1 sleep 2; echo $?' # => 124
答案2
您可以嘗試像這樣執行命令:
bash -c "timeout 1 sleep 2"; echo $?