終止無限循環

終止無限循環

我有一個命令,我想在每次終止時自動再次運行,所以我運行瞭如下命令:

while [ 1 ]; do COMMAND; done;

但如果我不能用 as 停止循環,Ctrl-c那隻會殺死COMMAND而不是整個循環。

我如何實現類似但無需關閉終端即可停止的功能?

答案1

ctrl您可以使用+停止正在執行的作業並將其置於背景z。然後你可以透過以下方式終止你的工作:

$ kill %1

其中 [1] 是您的工作編號。

答案2

檢查指令的退出狀態。如果指令由訊號終止,則退出代碼將為 128 + 訊號編號。來自bash 的 GNU 線上文檔

對於 shell 而言,以零退出狀態退出的命令已成功。非零退出狀態表示失敗。使用這種看似違反直覺的方案,因此有一種明確定義的方法來指示成功,並有多種方法來指示各種失敗模式。當指令因編號為 N 的致命訊號而終止時,Bash 使用值 128+N 作為退出狀態。

POSIX 也指定由訊號終止的命令的值大於 128,但似乎沒有像 GNU 那樣指定其確切值:

由於收到訊號而終止的命令的退出狀態應報告為大於 128。

例如,如果您使用 control-C 中斷命令,則退出代碼將為 130,因為 SIGINT 在 Unix 系統上是訊號 2。所以:

while [ 1 ]; do COMMAND; test $? -gt 128 && break; done

答案3

我想說最好將無限循環放入腳本中並在那裡處理訊號。這是一個基本出發點。我確信您會想要修改它以適應。該腳本用於trap捕獲ctrl- c(或SIGTERM),終止命令(我sleep在這裡用作測試)並退出。

cleanup ()
{
kill -s SIGTERM $!
exit 0
}

trap cleanup SIGINT SIGTERM

while [ 1 ]
do
    sleep 60 &
    wait $!
done

答案4

如果您運行 bash,-e它將在任何錯誤情況下退出:

#!/bin/bash -e
false # returns 1
echo This won't be printed

相關內容