运行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