防止 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