不同的脚本可以共享一个锁文件以确保它们不会互相干扰吗?

不同的脚本可以共享一个锁文件以确保它们不会互相干扰吗?

我过去经常使用 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

相关内容