我有一個Shell腳本,需要在一個循環中運行,並執行一系列命令,並且當它完成時重複,因此循環。每個命令之間都有幾分鐘的睡眠命令。 「工作」不應該終止。我可以讓腳本啓動一個啓動時間,但是當系統重新啓動時,它需要繼續在命令序列中停止的地方。如何在重新引導後繼續使用Shell腳本?
我該如何做到最好?我應該創建一個命令隊列的MySQL表,並讓它在每次成功執行後刪除每一行?然後,當它完成循環時,它將重新填充隊列表並從頂部開始。
這似乎是我錯過了一些東西,使這更簡單。預先感謝您的有益見解!
我有一個Shell腳本,需要在一個循環中運行,並執行一系列命令,並且當它完成時重複,因此循環。每個命令之間都有幾分鐘的睡眠命令。 「工作」不應該終止。我可以讓腳本啓動一個啓動時間,但是當系統重新啓動時,它需要繼續在命令序列中停止的地方。如何在重新引導後繼續使用Shell腳本?
我該如何做到最好?我應該創建一個命令隊列的MySQL表,並讓它在每次成功執行後刪除每一行?然後,當它完成循環時,它將重新填充隊列表並從頂部開始。
這似乎是我錯過了一些東西,使這更簡單。預先感謝您的有益見解!
您可能需要重寫代碼,以便它看起來像這樣:
while: ; do
case $step in
0) command_1 && ((step++)) ;;
1) command_2 && ((step++)) ;;
...
9) command_9 && step=0 ;;
*) echo "ERROR" >&2 ; exit 1 ;;
esac
done
所以,你會知道什麼已經通過測試的step
值來完成。
然後,你可能要設置一個trap
執行while
循環之前,這樣,在退出的step
值寫入日誌文件:
trap "echo step=$step > log_file" EXIT
然後,你需要do是在腳本開始處的日誌文件source
,最後一個將繼續其停止工作。
對於這種情況,MySQL聽起來像是一個非常複雜的解決方案。一般來說,我會考慮一些基於文件系統的標記。您可以將當前的執行狀態保存在一個或多個文件中。 G。在/var/run
中,並使腳本在啓動時檢查這些文件。
當您完成一個步驟時,您將文件重命名以反映需要完成的下一步操作等等。
最後,重命名或刪除它,以便下次腳本運行時,它將啓動一個新的循環。
我認爲你可以使用一個cron作業。一個cron作業可以每分鐘執行一次,並且使用「鎖定文件」策略,只有當鎖定文件不存在時,才能運行腳本,因此當前一個運行腳本結束時。
謝謝!所以它會將step的值存儲在log_file中,並且在腳本開始時它會讀取此文件以獲取它的剩餘步長值?我也可以在完成步驟++之後完成它,並且還將此值寫入到log_file中,以防萬一UPS發生故障並且突然斷電時中斷。 這看起來像一個很好的解決方案! – Edward
@愛德華:確實,這是一個好主意。如果你這樣做了,你可能想要使用類似於你在每一步調用的「執行」函數,並且執行所有增量操作,測試命令是否正確執行,並將步驟的值寫入log_file 。不要忘記在腳本的開頭添加'source log_file'。 – michaelmeyer
我不清楚什麼源log_file引用。有沒有一個源shell命令,或者這是變量集來保存log_file的內容?謝謝! – Edward