2013-02-27 3 views
5

У меня есть вопрос, и я не могу найти помощь где-либо в stackoverflow или в Интернете.Вход в неблокирующий именованный канал?

У меня есть программа (распределенная задача с сельдерием), и у меня есть несколько экземпляров (работников), каждый из которых имеет файл журнала (celery_worker1.log, celery_worker2.log).

Важные ошибки хранятся в базе данных, но мне нравится время от времени затягивать эти журналы при запуске новых операций, чтобы убедиться, что все в порядке (уровень log ниже).

Моя проблема: эти журналы занимают много места на диске. То, что я хотел бы сделать: иметь возможность «смотреть» журналы (хвост -f) только тогда, когда мне это нужно, без того, чтобы они занимали много места.

Мои идеи до сих пор: журналы

  • outputing на стандартный вывод, а не в файл: здесь невозможно, так как у меня есть много рабочих outputing в разные файлы, но я хочу, чтобы хвост их все сразу (хвост - f celery_worker * .log)
  • использование logrotate: это решение «ОК» для меня. Я не хочу, чтобы это была ежедневная задача, но скорее не ставила бы минуту crontab для этого, и больше, сервер не мой, так что это означало бы некоторую работу на стороне администратора.
  • с использованием именованных каналов: it выглядел хорошо на первый взгляд, но я не знал, что именованные каналы (linux FIFO) блокируют. Следовательно, когда я не нахожу хвост -f ВСЕХ труб в одно и то же время, или когда я просто ухожу с моего хвоста, операции записи из регистратора блокируются.

Есть ли способ иметь неблокирующий именованный канал, который будет просто бросать в stdout при хвосте и бросать в/dev/null, если нет?

Или существуют технические трудности для такого типа трубы? Если да, то какие?

Благодарим за ответы!

+0

Возможный дубликат [Linux неблокирующий fifo (по запросу)] (http://stackoverflow.com/questions/7360473/linux-non-blocking-fifo-on-demand-logging) –

ответ

1

Имейте каждого рабочего журнала в стандартный вывод, но подключайте каждый stdout к утилите, которая автоматически обматывает и вращает журналы в зависимости от размера или времени. multilog и svlogd являются примерами таких. Для этих программ вы просто зацикливаете «текущий» файл журнала.

Вы правы, что logrotate - не совсем правильное решение проблемы, которая у вас есть.

Именованные трубы не будут работать так, как вы хотите. В лучшем случае ваши писатели могут заполнить свои трубы, а затем отбросить последующие журналы, что является обратным поведению, которое вы хотите.

+0

Спасибо @pilcrow за ваш ответ. Все 5 работников запускаются в фоновом режиме с помощью одной команды, и я не хочу, чтобы экран с вкладками всегда открывался, поэтому как я могу их подключить к различным stdouts? И подтверждаете ли вы, что «неблокирующие именованные каналы, перенаправляющие на/dev/null, когда они не прочитаны», не существуют как таковые? спасибо –

+0

@noe, относительно совместного или отдельного проекта ... это зависит. Мы не знаем достаточно об их призыве, чтобы сказать. Что касается такой названной семантики канала, которая не существует, верьте. – pilcrow

1

Вы можете попробовать использовать совместно используемое запоминающее устройство man:shm_overview или, возможно, несколько из них. Вам нужно организовать их как круговые буферы, чтобы они сохраняли последний N kb вашего журнала, и всякий раз, когда вы читаете их с помощью считывателя, он выводит все на консоль. Этот подход применяется к набору syslog/logread для busybox (см. logread.c).

Смежные вопросы