flock
это один из способов блокировки операций. Утилита является частью набора инструментов util-linux и доступна только для Linux. Другие утилиты, доступные на более широком спектре платформ, основаны на setlock
утилите Дэниела Бернштейна из его пакета daemontools:
Эти инструменты работают с несколько иной парадигмой, чем в ответе М. Куренкова (тот, который 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 '... заблокирован; прочее ...
`pwd`
; Вы можете просто использовать точку (.
). Также вы должны заключить это имя в кавычки, так как оно содержит переменные .