bash flock: выход, если не удается получить блокировку
следующий механизм блокировки используется для предотвращения cron
задание выполняется одновременно:
#!/bin/bash
echo "Before critical section"
(
flock -e 200
echo "In critical section"
sleep 5
) 200>/tmp/blah.lockfile
echo "After critical section"
при запуске двух экземпляров вместе, позже ждет, пока первый не завершится, а затем запускается. Это может привести к задержкам выполнения сценариев.
как изменить этот скрипт, чтобы если flock
не удается получить блокировку, она завершает скрипт? Я пытался -n
без успеха.
2 ответов
flock -n -e 200 || exit 1
flock -n
говорит вам, что это не удалось, возвращая код ошибки (не ноль). Вместо этого вы могли бы сделать set -e
в верхней части скрипта, чтобы сделать его выход, когда он видит любую непроверенную ошибку.
в зависимости от вашего приложения, вы могли бы хотеть exit 0
для указания успеха, когда замок не может быть приобретен.
мы используем эксклюзивную блокировку на файл скрипта, - имя командного файла.
exec 200<
flock -n 200 || exit 1
все решение состоит из двух строк кода. Но трюк состоит в том, чтобы открыть $0 для чтения, а затем получить эксклюзивную блокировку для него.