避免同一脚本的两个实例同时运行的典型方法如下:
[ -f ".lock" ] && exit 1 touch .lock # do something rm .lock
有没有更好的方法来锁定shell脚本中的文件,从而避免出现竞争状况?必须使用目录代替吗?
是的,示例脚本中确实存在竞争条件。您可以使用bash的noclobber选项,以便在比赛-f和其他测试脚本潜行时出现比赛失败touch。
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