У меня есть php irc бот, который входит в stdout и запускается с помощью nohup через while true: php bot.php; sleep 60
Стиль Bash скрипт, чтобы действовать как сторожевой таймер.
Он выводит много данных, в основном шум, но может быть полезным для отладки состояния во время ошибок, поэтому я начал передавать stdout через gzip, единственная проблема заключается в том, что я не могу прочитать файл, пока он не закроется, поэтому проблемы отладки, обнаруженные в рабочей среде, могут стать боль, так как я должен закрыть все, чтобы получить доступ к журналам.
Я надеялся, что это может быть простое решение, я нашел одно вокруг установки размеров буфера, используя stdbuf
но, похоже, это не помогло, я думаю, что gzip может делать свою собственную буферизацию.
Есть ли лучший способ отправить стандартный вывод долго работающей программы в сжатый файл, который позволяет достичь пика в середине файла?
Способ, которым большинство демонов стараются справиться с этим, состоит в том, чтобы прослушивать сигнал типа SIGHUP или один из SIGUSR, сбрасывать свои буферы журнала на диск, затем закрывать и снова открывать дескриптор файла журнала. Это сделано для того, чтобы системная утилита, такая как logrotate, уже могла переименовывать файл и просто сигнализировать запущенному процессу о необходимости очистить и восстановить.
После того, как вы разобрались, вы можете использовать существующие службы ротации журналов, чтобы вращать и сжимать файлы журналов. за Вы основаны на ограничениях по времени и / или размеру, вместо того, чтобы беспокоиться о реализации этих капризов в вашем приложении.
Ты можешь использовать gzlog.c
/gzlog.h
. Он эффективно записывает короткие сообщения журнала в файл gzip, оставляя полный и правильный файл gzip после каждой записи. Это делается путем добавления несжатых сообщений журнала до достижения порогового значения, после чего несжатые сообщения журнала сжимаются.