一尘不染

当使用锁定文件来避免脚本的两个实例同时运行时,如何避免竞争状况?

linux

避免同一脚本的两个实例同时运行的典型方法如下:

[ -f ".lock" ] && exit 1
touch .lock
# do something
rm .lock

有没有更好的方法来锁定shell脚本中的文件,从而避免出现竞争状况?必须使用目录代替吗?


阅读 214

收藏
2020-06-03

共1个答案

一尘不染

是的,示例脚本中确实存在竞争条件。您可以使用bash的noclobber选项,以便在比赛-f和其他测试脚本潜行时出现比赛失败touch

以下是一个示例代码片段(受本文启发),说明了该机制:

if (set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null; 
then
   # This will cause the lock-file to be deleted in case of a
   # premature exit.
   trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT

   # Critical Section: Here you'd place the code/commands you want
   # to be protected (i.e., not run in multiple processes at once).

   rm -f "$lockfile"
   trap - INT TERM EXIT
else
   echo "Failed to acquire lock-file: $lockfile." 
   echo "Held by process $(cat $lockfile)."
fi
2020-06-03