运行shell脚本时,我要绝对确定在给定时间仅运行该脚本的一个实例。

我是否应该采用文件锁定机制,例如

touch lockfile
do_work
rm lockfile

够了吗?

最佳答案

它认为您的逻辑更像是:

if [ ! -e lockfile ]; then
    touch lockfile
    do_work
    rm lockfile
fi

但是要注意,仅此还不够。确实,它为微妙的错误铺平了道路。由于整个过程不是原子的,因此第二个过程也可能恰好在if子句之后但在touch子句之前开始。

一个不太天真的想法实现会尝试自动获取锁。这可以在Bash中完成。

一种可能的解决方案是noclobber选项,该选项禁止写入已经存在的文件,从而以更原子的方式完成if子句和touch命令。

我的锁获取代码将如下所示:
if ! ( set -o noclobber; echo > lockfile ) exit

09-07 07:04