собрать воедино выходной файл

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