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 для чтения, а затем получить эксклюзивную блокировку для него.