Правильный способ выполнения операции мьютекса с помощью утилиты lockf в сценарии оболочки - PullRequest
1 голос
/ 13 февраля 2020

Я хотел добавить мьютекс к моему сценарию оболочки. Это возможно с flock, но утилита не установлена ​​на моей оболочке и не сможет установить эту утилиту или любые другие утилиты. Я попытался использовать lockf вместо этого, чтобы получить блокировку, но не смог заставить ее работать как положено. Ниже приведен фрагмент того, что я пытался сделать.

lockf -k /tmp/lock "echo $$ > lock"
echo "locked"
sleep 10

rm -f /tmp/lock
echo "unlocked

В идеале, если мы запустим этот скрипт на двух терминалах, второй экземпляр должен ожидать блокировки, пока первый экземпляр не удалит файл блокировки. Куда я иду не так? Любые предложения будут очень полезны.

1 Ответ

0 голосов
/ 14 февраля 2020

Например, если вы хотите иметь cron каждую минуту, но хотите запретить многократный запуск сценария, вы можете использовать что-то вроде:

* * * * * lockf -t 0 /tmp/foo.lock /path/to/foo.sh

В этом случае lockf создаст файл блокировки /tmp/foo.lock и автоматически удалит его при выходе.

Опция -t 0 предотвращает создание слишком большого количества lockf процессов, его можно прочитать как ждать N секунд, пока блокировка не удалить или выйти , если -t N не указан lockf будет ждать бесконечно.

От lockf man :

-t   seconds   Specifies a timeout for waiting for the lock.  By default,
     lockf waits indefinitely to acquire the lock.  If a timeout
     is specified with this option, lockf will wait at most the
     given number of seconds before giving up.  A timeout of 0 may
     be given, in which case lockf will fail unless it can acquire
     the lock immediately.  When a lock times out, command is not
     executed.

Получив файл блокировки, вы можете проверить его следующим образом:

lockf -t 0 /tmp/foo.lock uname

И получит что-то вроде:

lockf: /tmp/foo.lock: already locked
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...