2013-01-25 81 views
1

我有一個Shell腳本,需要在一個循環中運行,並執行一系列命令,並且當它完成時重複,因此循環。每個命令之間都有幾分鐘的睡眠命令。 「工作」不應該終止。我可以讓腳本啓動一個啓動時間,但是當系統重新啓動時,它需要繼續在命令序列中停止的地方。如何在重新引導後繼續使用Shell腳本?

我該如何做到最好?我應該創建一個命令隊列的MySQL表,並讓它在每次成功執行後刪除每一行?然後,當它完成循環時,它將重新填充隊列表並從頂部開始。

這似乎是我錯過了一些東西,使這更簡單。預先感謝您的有益見解!

回答

1

您可能需要重寫代碼,以便它看起來像這樣:

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,最後一個將繼續其停止工作。

+0

謝謝!所以它會將step的值存儲在log_file中,並且在腳本開始時它會讀取此文件以獲取它的剩餘步長值?我也可以在完成步驟++之後完成它,並且還將此值寫入到log_file中,以防萬一UPS發生故障並且突然斷電時中斷。 這看起來像一個很好的解決方案! – Edward

+0

@愛德華:確實,這是一個好主意。如果你這樣做了,你可能想要使用類似於你在每一步調用的「執行」函數,並且執行所有增量操作,測試命令是否正確執行,並將步驟的值寫入log_file 。不要忘記在腳本的開頭添加'source log_file'。 – michaelmeyer

+0

我不清楚什麼源log_file引用。有沒有一個源shell命令,或者這是變量集來保存log_file的內容?謝謝! – Edward

0

對於這種情況,MySQL聽起來像是一個非常複雜的解決方案。一般來說,我會考慮一些基於文件系統的標記。您可以將當前的執行狀態保存在一個或多個文件中。 G。在/var/run中,並使腳本在啓動時檢查這些文件。

當您完成一個步驟時,您將文件重命名以反映需要完成的下一步操作等等。

最後,重命名或刪除它,以便下次腳本運行時,它將啓動一個新的循環。

0

我認爲你可以使用一個cron作業。一個cron作業可以每分鐘執行一次,並且使用「鎖定文件」策略,只有當鎖定文件不存在時,才能運行腳本,因此當前一個運行腳本結束時。