Bash Flock выходной файл - PullRequest
       16

Bash Flock выходной файл

1 голос
/ 17 апреля 2019

Если несколько процессов могут записывать в один и тот же выходной файл, безопасно ли собирать сам выходной файл вместо отдельного файла блокировки?

например. это безопасно?

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 Ответ

1 голос
/ 17 апреля 2019

Да, то, что вы предлагаете, является безопасным в рамках конкретного (узкого) шаблона использования.

Вещи, которые вы можете безопасно сделать с одним файлом

  • Открыть файл только для добавления , не удерживая блокировку.
  • Обрезать файл только после удержания блокировки
  • Измените файл, пока удерживается блокировка , таким образом, чтобы не изменять, какой индекс в записи каталога относится к .

Вещи, которые вы можете делать только с двумя отдельными файлами

  • Сначала откройте файл блокировки с помощью O_TRUNC.
  • Используйте шаблон создания и переименования для атомарного изменения файла данных, пока блокировка удерживается.
  • Полностью удалите файл данных, как в случае rm - гарантируя, что любая вновь созданная версия получит другой инод - при удержании блокировки.
...