2012-12-26 35 views
3

我正在編寫一個腳本,它可以按順序執行大約10個後端進程,具體取決於前一個進程是否未發生任何錯誤。可恢復腳本的最佳選擇

現在讓我們假設場景,其中可以說第5個進程失敗並且腳本出來了。但是我想以這樣的方式對它進行編碼,當下次用戶運行它時(由於上次退出腳本而刪除錯誤之後),他應該能夠從第5個進程開始運行,而不是從第1個進程再次運行。

更具體地講,假設下面是腳本:

Script Starts 
Process1 
if [ $? -eq 0 ] then 
Process2 
if [ $? -eq 0 ] then 
Process3 
if [ $? -eq 0 ] then 
.. 
.. 
.. 
.. 
if [ $? -eq 0 ] then 
Process10 
else 
exit 

所以這裏的腳本將隨時退出,如果過程中的任何一個失敗,那麼再次與狀態0完成,如果process5失敗,用戶糾正問題並重新啓動腳本,腳本應該再次以process5開始,而不是process1,或者至少應該有一個選項給用戶,如果他想恢復腳本或從開始即process1開始。

什麼所有可能的方式,我們可以編寫這種腳本,也請記住,我不允許使用臨時數據庫,在那裏我可以存儲每個進程的狀態。

我需要在sh(shell腳本)中的代碼在unix中。

+0

'臨時數據庫'是否也意味着硬盤上沒有臨時平面文件?你允許編輯現有文件嗎?這個任務的範圍是什麼(換句話說,它保證了這個人將在同一時間運行這個程序?或者這個狀態必須堅持登錄) – jsvk

回答

3

簡單的解決辦法是寫戳文件:

#/bin/sh 

set -e # Automatically abort if any simple command fails 

if ! test -f cmd1-stamp; cmd1; fi 
touch cmd1-stamp 
if ! test -f cmd2-stamp; cmd2; fi 
touch cmd2-stamp 

當腳本執行,如果cmd1-stamp存在,不執行cmd1。否則,執行cmd1。如果失敗,該腳本將中止。請注意,它是非常誘人寫test -f cmd1-stamp || cmd1,這似乎工作(在bash中),但殼牌規格指出,如果簡單命令失敗is not a part of an AND or OR list,殼我應該放棄,我懷疑這是(又一個) bash不符合規範。 (雖然它似乎沒有指定如果失敗的命令是AND或OR列表的一部分,shell不會中止。)

+0

,我想以'rm * -stamp'結尾 – Bohemian

+0

如果你當腳本運行完成時想要刪除圖章文件,那麼'rm * -stamp'似乎是一個合理的事情。 –

+0

@william對於你來說,這是一個vlid和fsibl apprch。但我不是一個職業腳本編寫者,也不能理解一些東西。 請用簡單的術語展示dis: 請注意,編寫test -f cmd1-stamp ||是非常誘人的。 cmd1,這似乎工作(在bash中),但shell規範聲明,如果失敗的簡單命令不是AND或OR列表的一部分,shell將中止,並且我懷疑這是(又一個)bash實例不符合規格。 (雖然它似乎沒有指定如果失敗的命令是AND或OR列表的一部分,shell不會中止。) –