2013-05-21 190 views
2

我在shell腳本中有一個要求,如果shell由於某種原因終止I.e終端關閉或用戶終止,我想做一些工作,如清理和解鎖等。可能嗎?如果是這樣,請解釋如何完成。 在此先感謝, Praveen P BShell腳本終止通知

回答

7

是的,這是可能的。使用trap命令檢查信號。見help trap

cleanup() { 
    ... 
    exit 
} 

trap cleanup SIGINT # user terminated 
trap cleanup SIGHUP # terminal closed 
trap cleanup SIGTERM # killed with kill -15 
+0

+1。次要評論:只有SIGKILL或SIGSTOP不能被捕獲。但是SIGSTOP並沒有真正殺死進程,只是停止它直到收到SIGCONT。 – TrueY

1

什麼@Grzegorz說,是正確的,但要注意以下幾點:

  • 你沒有標明OS(和外殼,但我們假設sh) ,所以要保持POSIXly正確,你應該使用大寫信號名稱(如SIGINT)。另見here

  • 除非您想讓腳本繼續運行,否則在收到信號後,應該將exit作爲「清理」功能的最後一行。

  • 不要忘記在以其他方式退出腳本之前(即在「結束」或在您手動呼叫exit之前)手動調用您的「清除」功能。或者用trap cleanup EXIT註冊一個處理程序。

  • 請注意,您不能通過這種方式(或任何其他方式)趕上SIGKILL,即kill -9 <mypid>。因此,請確保您可以以某種方式處理清理可能實際上而不是發生的事實。例如,在腳本初始化期間檢查舊的(孤立的)鎖定文件是否仍然存在,並退出時出現錯誤,並通知用戶/管理員手動清除。現在,區分合法存在的鎖文件和被殺實例的剩餘文件可能不是微不足道的,主要取決於您的腳本。您可以將腳本PID寫入鎖定文件,然後,如果腳本(另一個實例)發現鎖定文件時存在鎖定文件,請確保具有該PID的進程仍然存在,如果存在,機會另一個腳本實例是真正運行的。否則,手動清理可能是必要的。但即使這不是100%安全的。

+0

謝謝,更新了我對POSIX兼容性和退出調用的回答。 –