POSIX (IEEE Std 1003.1-2001) не определяет поведение одновременных write () системных вызовов, отправляющих данные в один и тот же файл, поэтому вы можете получить разные результаты в зависимости от вашей платформы. Вы можете попытаться объединить все printfs
в одно в надежде, что это сработает, но даже если это произойдет, нет гарантии, что это будет в будущем или на другой платформе.
Вместо того, чтобы использовать управление параллельным доступом и сброс для обеспечения последовательности операций записи, вы можете отправлять сообщения третьему процессу, который будет последовательно записывать ваши сообщения журнала в файл от имени всех процессов. Фактически, это то, что сделано с logger
и syslog
в сообщении , которое вы цитировали. Команда logger
не отправляет сообщения на /var/log/messages
. Он отправляет сообщения журнала на syslog
, который можно настроить для сохранения сообщений журнала в любом месте. Однако для изменения этой конфигурации обычно требуются права администратора.
Если вы не можете или не хотите использовать syslog
, вы также можете использовать netcat в качестве сервера регистрации. Запустите его, чтобы мультиплексировать все входящие сообщения журнала из всех сценариев в файл (это задание должно постоянно выполняться в фоновом режиме, вы также можете запустить его на экране ):
nc -luk localhost 9876 > shared_log_file &
(порт 9876 - просто пример) и войдите в каждый скрипт следующим образом:
printf "Log message\n" > /dev/udp/localhost/9876
Вы также можете использовать собственный сервер UDP вместо netcat (например, как этот ).