Параллельная запись в файл из нескольких процессов с использованием эха

Я написал функцию в нашей ERP-системе, которая записывает журнал в файл на сервере, просто «отражая» его в файле журнала.

echo "SOME LOGDATA" >> /users/erp/log/LOGMSG

Каждый раз, когда пользователь инициирует определенное событие, вызывается функция LOG.

Что произойдет, если 2 пользователя инициируют событие LOG одновременно?

Заботится ли «эхо» о блокировке файлов? На мой взгляд, это должно быть ядро ​​​​linux или bash, которые должны позаботиться о том, чтобы файл не был записан двумя инструкциями командной строки одновременно.

Я написал тестовый пример, чтобы заставить это условие (около 1000 вызовов LOG в течение одной секунды), и кажется, что мои мысли верны, но я не могу быть уверен, что эти вызовы выполняются одновременно на bash.


person Alexander Baltasar    schedule 24.11.2015    source источник
comment
Есть ли причина не использовать регистратор?   -  person Markus W Mahlberg    schedule 24.11.2015


Ответы (3)


Как объясняется здесь, эхо гарантированно будет атомарным только при записи последовательностей короче, чем меньшее из PIPE_BUF и размер стандартного вывода буфер (который, скорее всего, BUFSIZ).

Для более длинных последовательностей вам необходимо заблокировать. Использование может использовать lockfile-create и lockfile-check.

person Claudio    schedule 24.11.2015

Вы можете использовать GNU Parallel в качестве мьютекса/семафора, гарантируя, что только один echo запускается одновременно, например:

sem --id mysem echo "System crashed"  >> log.txt

GNU Parallel установлен в большинстве дистрибутивов Linux и легко доступен для OSX через homebrew.

Вы можете проверить эту идею, запустив цикл в каждом из двух или более терминалов и заставив каждый из них сделать следующее:

for i in {1..100}; do sem --id mysem echo hi >> log ; done

и в конце вы увидите, что в вашем журнале ровно 100 строк на каждый терминал.

person Mark Setchell    schedule 24.11.2015

Будьте осторожны, чтобы не изобретать велосипед, в системах *nix есть syslog для правильной обработки журналов. . Проблема с echo в файл заключается в том, что вы можете применить взаимное исключение, но самой сложной частью будет обработка сериализации, тот факт, что один echo пишет перед другим, не означает, что зарегистрированная операция фактически выполняется первой (и не параллельно).

person Oberix    schedule 24.11.2015
comment
Я знаю системный журнал. Но, насколько я знаю, он регистрирует все сообщения в /var/log/message, что не является подходящим местом для моих журналов. - person Alexander Baltasar; 24.11.2015
comment
На самом деле вы можете настроить его для регистрации в любом месте на основе имени процесса. - person Oberix; 24.11.2015
comment
Не знал, что его можно настроить. Спасибо за это. Можете ли вы вести журнал как обычный пользователь, не будучи пользователем root или используя sudo? - person Alexander Baltasar; 24.11.2015