2

Мне нужно периодически обновлять журнал. Это блок из примерно 10 строк текста. Я использую тройник, и он работает прямо сейчас. Тем не менее, производительность менее удовлетворительная. Он ждет некоторое время, а затем выводит несколько блоков текста из нескольких обновлений (особенно, когда программа только запускается, требуется довольно много времени, чтобы начать отображать что-либо на консоли, и когда я впервые увидел это, я подумал, что программа зависла). Кроме того, он случайно разбивается в середине последнего блока, так что это довольно уродливо.

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

Обновление: вот что сейчас находится в моем bash-скрипте: tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log

2 ответа2

1

Я думаю, что ваша проблема проистекает из фундаментальной особенности каналов - буферизации.

Эти обходные грязны , но вы должны смотреть на команды , как unbuffer или script или stdbuf

Возможно, что-то, чтобы остановить буферизацию вывода, например:

 your_program | stdbuf -o0 tee

PS. Сейчас я не за консолью, поэтому я не могу попробовать это.

0

Я использую группирование команд и перенаправляю вывод в подстановку процесса. Внутри я передаю его в /dev /tty и stdout. Затем я перенаправляю stdout и stderr в файл. У меня пока работает. Вы можете легко добавить к выводу временную метку и идентификатор процесса, если хотите.

{
  #script goes here
} > >(while read TEXT ; do MESSAGE="$(date +"%d.%m.%Y") $(date +"%Hh%Mm%Ss") $LOGPREFIX $TEXT"; echo $MESSAGE; echo $MESSAGE > /dev/tty; done >> $LOGFILE) 2>&1 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .