После прохождения Баша документации , этот вопрос , и это один он все еще не ясно мне , как я могу выполнить атомную запись (добавление) операции в файл в Баше. У меня есть скрипт, который запускается в нескольких экземплярах и в какой-то момент должен записать данные в файл:
echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE
Как можно сделать все операции записи из всех одновременно работающих сценариев в этот файл атомарными (чтобы данные из одного экземпляра не перекрывали данные из другого)?
`pwd`
; Вы можете просто использовать точку (.
). Также вы должны заключить это имя в кавычки, так как оно содержит переменные .pwd
ранее в сценарии, чтобы уведомить пользователя о текущем рабочем каталоге, а также записывать записи в файл журнала. просматривая FIFO сейчас.mkfifo
а не вводный уровень.Ответы:
Кажется, вам нужно использовать
flock
как в примере с человеком ( http://linux.die.net/man/1/flock )И поместите все свои команды, которые должны быть атомарными, в ().
источник
/var/lock/mylockfile
станет доступным для блокировки./var/lock/mylockfile
процессе, который вызвалflock -x
?(flock -x 200; date; sleep 10; date;) 200>/var/lock/mylockfile
в двух оболочках и увидеть, что разблокировки происходят только после выполнения всех команд в () (то есть в подоболочке)flock
это один из способов блокировки операций. Утилита является частью набора инструментов util-linux и доступна только для Linux. Другие утилиты, доступные на более широком спектре платформ, основаны наsetlock
утилите Дэниела Бернштейна из его пакета daemontools:setlock
из daemontoolssetlock
от демона-бруса Брюса Гюнтераs6-setlock
от s6 Лорана Беркоchpst
из рунита Геррита Папеrunlock
из преступника Уэйна Маршаллаsetlock
из моего набора инструментов NoshЭти инструменты работают с несколько иной парадигмой, чем в ответе М. Куренкова (тот, который
flock
также может быть использован, но не в этом ответе). Один запускаетsetlock
программу, чтобы связать нагрузку с командой, которая должна быть заблокирована.setlock
сам открывает и блокирует файл блокировки и оставляет файловый дескриптор для его открытия в процессе. Блокировка сохраняется до тех пор, пока этот процесс работает (если только последующая команда, связанная цепочкой для явного снятия блокировки, путем поиска и закрытия дескриптора открытого файла).Для рассматриваемого случая необходимо заблокировать команду, которая создает строку вывода, зная, что это вызывает внешнюю команду
echo
вместо встроеннойecho
команды оболочки :В этом случае нет необходимости блокировать открытие выходного файла в режиме добавления. Если бы это было так, нужно было бы открыть этот файл в замке, что требует использования таких программ, как
которую можно превратить в функцию оболочки, если хотите: или придерживаясь синтаксиса оболочки и интерпретируя его второй оболочкой, работающей под блокировкой, требуя некоторого нетривиального цитирования, если переменные оболочки не экспортируются как переменные среды:fdredir
/redirfd
:Это, конечно, обобщает вещи, отличные от записи в выходные файлы:
источник