bash flock: выход, если не удается получить блокировку - PullRequest
17 голосов
/ 14 августа 2011

Следующий механизм блокировки используется для предотвращения одновременного запуска задания 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 ]

21 голосов
/ 14 августа 2011
flock -n -e 200 || exit 1

flock -n сообщает, что произошел сбой путем возврата кода ошибки (что-то отличное от нуля).Вместо этого вы могли бы сделать set -e в верхней части вашего скрипта, чтобы он завершился, когда обнаружит любую непроверенную ошибку.

В зависимости от вашего приложения, вы можете захотеть exit 0, чтобы указать успех, когда блокировка можетт быть приобретенным.

12 голосов
/ 05 сентября 2011

Мы используем эксклюзивную блокировку самого файла сценария, $0 - имя командного файла.

exec 200<$0
flock -n 200 || exit 1

Все решение состоит из двух строк кода.Но хитрость заключается в том, чтобы открыть $ 0 для чтения и затем получить эксклюзивную блокировку для него.

...