防止 Shell Script 重複執行

Shell Script 對日常系統維護很實用,對於多用戶系統,Shell Script 經常面對一個問題是重複執行,即一個 Shell Script 正在執行時,避免另一個使用者執行。另一個情況是,當 Shell Script 變得複雜及龐大時,放到 crontab 定時執行時 (例如每分鐘執行一次),Shell Script 還未完成上次的執行,就重複自動執行一次。

要防止 Shell Script 重複執行,一般上會用 lock file 及 PID 的方法,不論是 lock file 還是 PID,除了用 Bash 外,用其他程式語言 (如 Perl, PHP, Python) 寫的 Shell Script 也可以使用。以下會示範用較簡單的 lock file 方法來防止重複執行的問題。

這個方法的原理很簡單,當 Shell Script 開始執行時,會檢查是否有一個自訂的 lock file 存在,如果存在便不會停止執行。如果 lock file 不存在,會自動建立 lock file, 執行完成後刪除這個 lock file。先看看下面的例子:

程式一開始會定義了 lock file 在 “/tmp/shell-script.lock”,然後會執行 “/tmp/shell-script.lock” 是否存在,如果存在會印出 “shell script already running!” 並離開。

第 11 行會嘗試建立 lock file,第 13 至 17 行檢查 lock file 是否建立成功。主程式放在第 20 行的位置,而當程式執行完成後,會用 rm 刪除建立的 lock file — “/tmp/shell-script.lock”.

如果執行 shell script 時意外關機, 例如斷電, 往後會不能執行該 shell script, 需要手動刪除 lock file (即 /tmp/shell-script.lock) 才可以。




Leave a Reply