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