我过去经常使用 flock 来确保一个进程只产生一次(以防它被挂起等),但我从未将它用于两个不同的进程。
在这种情况下,两个不同的脚本影响同一个“临时”目录(每次运行开始时该目录都会被破坏)。所以我需要确保临时目录不会被一个脚本破坏,而另一个脚本仍然需要它。
我的目标:
- 确保2不同的脚本永远不会同时执行。
例如(cron示例):
0 * * * * flock -w 2 /tmp/lockfile.lock /some/script1.sh
2 * * * * flock -w 2 /tmp/lockfile.lock /another/script2.sh
这是将这两个脚本相互隔离的正确方法吗?
答案1
一个 DIY 方法是编写一个脚本,该脚本将处理你的锁文件,并最终执行你的工作。
假设您创建了一些/my/job
可执行文件,内容如下:
#!/bin/sh
# to be tuned, at your convenience
LASTLOG=/tmp/job.log
LOCKFILE=/tmp/lockfile.lock
RETRY=3
WAIT=10
if test -z "$1"; then
echo missing job script >&2
exit 1
elif ! test -x "$1"; then
echo can not execute "$1" >&2
exit 1
fi
cpt=0
while test $cpt -lt $RETRY
do
if ! test -s $LOCKFILE; then
echo $$ >$LOCKFILE
break
fi
sleep $WAIT
done
if ! grep ^$$$ $LOCKFILE >/dev/null 2>&1; then
echo could not acquire lock >&2
exit 2
fi
"$1" >$LASTLOG 2>&1
ret=$?
rm -f $LOCKFILE
exit $?
然后,你的 crontab 将如下所示:
0 * * * * /my/job /some/script1.sh
2 * * * * /my/job /some/script2.sh
答案2
我的 Debian 上有这个例子man flock
:
shell1> flock /tmp -c cat
shell2> flock -w .007 /tmp -c echo; /bin/echo $?
Set exclusive lock to directory /tmp and the second command will fail.
因此我认为锁定可以共享。
更多内容请参见的示例部分man flock
。