我有一個命令,我想在每次終止時自動再次運行,所以我運行瞭如下命令:
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