#bash #flock
#bash #соберите
Вопрос:
Если несколько процессов могут выполнять запись в один и тот же выходной файл, безопасно ли собирать сам выходной файл вместо отдельного файла блокировки?
Например, безопасно ли это?
outputFile=output.dat
exec 200>>"$outputFile"
flock -e 200
grep -i error "$1" >> "$outputFile"
flock -u 200
Во всех примерах, которые я нашел с flock, используется отдельный файл блокировки.
Например.
outputFile=output.dat
lockFile=/var/tmp/output.dat
exec 200>"$lockFile"
flock -e 200
grep -i error "$1" >> "$outputFile"
flock -u 200
Комментарии:
1. Я бы предложил
>amp;200
— быстрее, чем>>"$outputFile"
потому, что вы используете дескриптор, который уже открыт.2. (и, кстати, не важно цитировать
"error"
, но важно цитировать"$1"
).3. Спасибо, что указали на это. Я обновил его для потомков.
Ответ №1:
Да, то, что вы предлагаете, безопасно в рамках заданного конкретного (узкого) шаблона использования.
То, что вы можете безопасно делать с одним файлом
- Откройте файл только для добавления, не удерживая блокировку.
- Усекайте файл только после удержания блокировки
- Измените файл, пока удерживается блокировка, таким образом, чтобы не изменялся индекс, на который ссылается запись каталога.
То, что вы можете делать только с двумя отдельными файлами
- Сначала откройте файл блокировки с
O_TRUNC
помощью . - Используйте шаблон создания и переименования, чтобы атомарно изменять файл данных, пока удерживается блокировка.
- Удалите файл данных полностью, как и в случае с
rm
— гарантируя, что любая вновь созданная версия получит другой индекс — удерживая блокировку.