2013-02-20 1 views
2

Я использую именованный канал для захвата сообщений syslog. Затем я могу легко просмотреть syslog, сделав что-то вродеFIFO to grep to file

cat /var/log/local3.pipe | grep somefilter 
or 
grep somefilter /var/log/local3.pipe 

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

cat /var/log/local3.pipe | grep somefilter >> somefile.log 
or 
grep somefilter /var/log/local3.pipe >> somefile.log 

Файл всегда остается равным нулю. Кто-нибудь знает, почему? Я использую Red Hat Enterprise Linux 5. Спасибо.

Дополнительная информация: Для тех, кто хочет воспроизвести это вот полный список команд

su 
<enter root password> 
mkfifo /var/log/local3.pipe 
chmod 644 /var/log/local3.pipe 
echo "local3.* |/var/log/local3.pipe" >> /etc/syslog.conf 
/etc/init.d/syslog restart 
exit 

затем один SSH сессии:

cat /var/log/local3.pipe 

и в второй SSH сессии ("Протестируйте «должен показать в первой сессии ssh

logger -p local3.info "Test it" 

затем на первом сеансе измените его на

cat /var/log/local3.pipe >> somefile.log 

отправить еще несколько журналов на местный 3 (сообщение должно быть разным). Убедитесь, что сообщения идут в somefile.log

logger -p local3.info "Test it 2" 

затем в первой смены сессии он на

cat /var/log/local3.pipe | grep -i test >> somefile.log 

Теперь убедитесь, что журналы не собираются somefile.log

Обратите внимание, что сообщение должен отличаться от последнего сообщения, иначе регистратор не отправит его немедленно.

+0

Вы сначала делаете 'grep somefilter/var/log/local3.pipe' и только потом' grep somefilter /var/log/local3.pipe >> somefile.log'? Потому что содержимое трубы будет потреблено к тому времени. – Cairnarvon

+0

Привет, Cairnarvon. Перед выполнением второй команды я всегда завершаю первую. Я могу переключаться назад и вперед между этими двумя командами, и первое всегда работает, а второе всегда приводит к нулевому байтовому файлу. Если я делаю cat /var/log/local3.pipe >> somefile.log, то это работает. Похоже, что включение grep в микс (и подключение к файлу) останавливает работу. – MikeKulls

ответ

2

я могу воспроизвести вашу проблему, и это фиксирует это для меня:

cat /var/log/local3.pipe | grep -i --line-buffered test >> somefile.log 

Я думаю, что причина в том, что, когда стандартный вывод относится к терминалу (согласно isatty(3)), то используется линия буферизация, но как только вы перенаправляете файл, libc переключается на обычную буферизацию фиксированного размера. Поэтому вы должны были обследовать somefile.log до того, как был заполнен стандартный выходной буфер процесса grep, поэтому перед тем, как у него возникли какие-либо причины для записи в файл.

Другой способ заставить линии буферизация выглядит следующим образом:

cat /var/log/local3.pipe | stdbuf -oL grep -i test >> somefile.log 

Вы можете прочитать обо всем этом в этих двух больших статей:

(Я рад заметить, что stdbuf был написан парнем, который отправил мне по электронной почте сегодня о чем-то совершенно другом - маленьком мире!)

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

  • Нет связанных вопросов^_^