Синтаксически более простой вызов стаи - PullRequest
1 голос
/ 09 июля 2019

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

Обычный пример того, как сделать это с помощью Linux flock выглядит примерно так:

(
    flock -n 9 || exit 1
    if [ ! -f file.txt ]; then
        echo 'Simulate the file creation' > file.txt
    fi
) 9>/var/lock/mylockfile

Однако читать очень сложно, особенно если вы не знакомы с подоболочками и дескрипторами файлов.Мне интересно, можно ли вручную заблокировать и разблокировать файл:

flock --exclusive file.txt

if [ ! -f file.txt ]; then
    echo 'Simulate the file creation' > file.txt
fi

flock --unlock file.txt

Если нет, существует ли какой-либо аналогичный способ использования flock, который максимально удобочитаем, избегая подоболочек, execи т.д?

1 Ответ

0 голосов
/ 09 июля 2019

Я предлагаю вам следовать идиоме, представленной на странице руководства, и предоставить читателю URL-адрес страницы руководства в качестве комментария.В некотором смысле я предлагаю это изменение в вашем коде:

# flock usage:  Please see /9547943/sintaksicheski-bolee-prostoi-vyzov-stai
# Or see flock third form usage here:  http://man7.org/linux/man-pages/man1/flock.1.html

(
    flock -n 9 || exit 1
    if [ ! -f file.txt ]; then
        echo 'Simulate the file creation' > file.txt
    fi
) 9>/var/lock/mylockfile

Тем не менее, я думаю, что ваша логика в порядке, но я бы предпочел использовать другой файл блокировки, отличный от файла, который вы создаете.

Итак, вот как я бы попробовал ваш подход:

flock --exclusive /var/log/mylockfile

if [ ! -f file.txt ]; then
    echo 'Simulate the file creation' > file.txt
fi

flock --unlock /var/log/mylockfile

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

...