Выполнение операций атомарной записи в файл в bash

Проверьте ~ / .profile, если его нет в ~ / .bashrc

16
13.04.2017, 15:36
1 ответ

flock— один из способов блокировки операций. Утилита является частью набора инструментов util -linux и доступна только для Linux. Другие утилиты, доступные на более широком диапазоне платформ, основаны на утилите Дэниела Дж. Бернштейна setlockиз его пакета daemontools :

.
  • setlockиз daemontools
  • setlockиз daemontools Брюса Гюнтера -бис
  • s6-setlockиз s6 Лорана Берко
  • chpstиз рунита Геррита Пейпа
  • runlockот преступника Уэйна Маршалла
  • setlockиз моего набора инструментов Nosh

Эти инструменты работают с несколько иной парадигмой, чем та, что используется в ответе М. Куренкова (, которую flockможно также использовать, но не в этом ответе ). Один вызывает программу setlockдля загрузки цепи в команду, которая должна быть заблокирована. setlockсам открывает и блокирует файл блокировки и оставляет дескриптор файла для него открытым в своем процессе. Блокировка сохраняется до тех пор, пока действует этот процесс (, если только последующая команда, связанная с явной разблокировкой, не найдет и не закроет дескриптор открытого файла ).

Для случая в вопросе необходимо заблокировать команду, которая создает строку вывода, зная, что она вызывает внешнююechoвместо оболочки, созданной -в echoкоманде:

setlock mylockfile echo "$RESULT" >>./$TEMP_DIR/$OUT_FILE

В этом случае нет необходимости блокировать открытие выходного файла в режиме добавления. Если бы это было так, нужно было бы открыть этот файл в замке,что требует либо использования таких программ, какfdredir/ redirfd:

setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$RESULT"
, которые можно превратить в функцию оболочки, если нужно :
outfile() { setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "$@" ; }
[…]
outfile echo "$RESULT"
, либо придерживаться синтаксиса оболочки и интерпретировать его второй оболочкой, работающей под блокировкой, что требует некоторого не -тривиальное цитирование, если переменные оболочки не экспортируются как переменные окружения:
setlock mylockfile sh -c 'echo '"$RESULT"' >> "./'$TEMP_DIR'/'$OUT_FILE'"'

Это, конечно, распространяется и на другие вещи, кроме записи в выходные файлы:

setlock mylockfile sh -c '… interlocked ; stuff …'
5
20.08.2021, 12:10

Теги

Похожие вопросы