如何讓 timeout(1) 在 cron 中的行為就像在互動式 shell 中的行為一樣

如何讓 timeout(1) 在 cron 中的行為就像在互動式 shell 中的行為一樣

在互動式 bash 中執行此命令:

$ timeout 1 sleep 2; echo $?
124

回報1241 秒後,如預期並如超時 (1) 所述。

但是,如果我運行與 cron 作業相同的操作,或者如果我將其作為命令字串提供給 bash,則它不會:

$ bash -c "timeout 1 sleep 2; echo $?"
0

加到-ibash 呼叫沒有幫助,使用--foregroundtimeout(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 $?

相關內容