В прошлом я много использовал flock, чтобы гарантировать, что процесс запускается только один раз (на случай, если он зависнет и т. Д.), Но я никогда не использовал его для двух разных процессы.
В этом сценарии два разных сценария влияют на один и тот же каталог «temp» (каталог стирается в начале каждого запуска). Поэтому мне нужно убедиться, что временный каталог не засоряется одним скриптом, в то время как он все еще нужен другому.
Моя цель:
Например (пример cron):
0 * * * * flock -w 2 /tmp/lockfile.lock /some/script1.sh
2 * * * * flock -w 2 /tmp/lockfile.lock /another/script2.sh
Это правильный способ изолировать эти два сценария друг от друга?
Сделай сам, чтобы написать скрипт, который будет иметь дело с твоим файлом блокировки, в конце концов, выполняя свою работу.
Скажем, вы создаёте какой-нибудь /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 $?
Тогда ваш кронтаб будет выглядеть так:
0 * * * * /my/job /some/script1.sh
2 * * * * /my/job /some/script2.sh
Этот пример есть в man flock
в моём Debian:
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.
Так что, как я понял, блокировка может быть разделена.
Смотрите больше в разделе EXAMPLES man flock
.