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 …'