канал stdout в gzip долго работающей программы таким образом, чтобы вы могли читать ее во время выполнения

У меня есть php irc бот, который входит в stdout и запускается с помощью nohup через while true: php bot.php; sleep 60 Стиль Bash скрипт, чтобы действовать как сторожевой таймер.

Он выводит много данных, в основном шум, но может быть полезным для отладки состояния во время ошибок, поэтому я начал передавать stdout через gzip, единственная проблема заключается в том, что я не могу прочитать файл, пока он не закроется, поэтому проблемы отладки, обнаруженные в рабочей среде, могут стать боль, так как я должен закрыть все, чтобы получить доступ к журналам.

Я надеялся, что это может быть простое решение, я нашел одно вокруг установки размеров буфера, используя stdbuf но, похоже, это не помогло, я думаю, что gzip может делать свою собственную буферизацию.

Есть ли лучший способ отправить стандартный вывод долго работающей программы в сжатый файл, который позволяет достичь пика в середине файла?

0

Решение

Способ, которым большинство демонов стараются справиться с этим, состоит в том, чтобы прослушивать сигнал типа SIGHUP или один из SIGUSR, сбрасывать свои буферы журнала на диск, затем закрывать и снова открывать дескриптор файла журнала. Это сделано для того, чтобы системная утилита, такая как logrotate, уже могла переименовывать файл и просто сигнализировать запущенному процессу о необходимости очистить и восстановить.

После того, как вы разобрались, вы можете использовать существующие службы ротации журналов, чтобы вращать и сжимать файлы журналов. за Вы основаны на ограничениях по времени и / или размеру, вместо того, чтобы беспокоиться о реализации этих капризов в вашем приложении.

1

Другие решения

Ты можешь использовать gzlog.c/gzlog.h. Он эффективно записывает короткие сообщения журнала в файл gzip, оставляя полный и правильный файл gzip после каждой записи. Это делается путем добавления несжатых сообщений журнала до достижения порогового значения, после чего несжатые сообщения журнала сжимаются.

0

По вопросам рекламы [email protected]