Мне нужно отобразить периодически обновляемый журнал. Это блок примерно из 10 строк текста. Я использую |tee, и он работает прямо сейчас. Однако производительность не очень удовлетворительная. Он ждет некоторое время, а затем выводит несколько блоков текста из нескольких обновлений (особенно когда программа только запускается, требуется довольно много времени, чтобы начать отображать что-либо на консоли, и когда я увидел это в первый раз, я подумал, что программа зависла). Кроме того, он случайно прерывается в середине последнего блока, поэтому его довольно некрасиво представлять.
Есть ли способ улучшить это? (Может быть, выводить меньше каждый раз и чаще переключаться между выходным файлом и консолью?)
Обновлять: Вот что сейчас находится в моем bash-скрипте:
tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log
решение1
Я думаю, что ваша проблема возникает из-за фундаментальной особенности каналов, а именно буферизации.
Обходные пути запутанны, но вам следует обратить внимание на такие команды, как unbuffer
или , script
или stdbuf
.
Возможно, что-то, что остановит буферизацию выходных данных с помощью тройника, например:
your_program | stdbuf -o0 tee
P.S. Я сейчас не за консолью, поэтому не могу это попробовать.
решение2
Я использую группировку команд и перенаправляю вывод в подстановку процесса. Внутри я вывожу его на /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
решение3
script
Бегать
$ script -c "your_program" result.log
вместо
$ your_program | tee result.log
например script -c "ls" result.log
.
Кстати: С помощью этой команды script
вы можете записать всю сессию bash, с которой вы начинаете
script result.log
и заканчиваете
exit
командой.
Этот ответ уже включен @curious_cat и является тем же ответом на этот вопрос:Запись сеанса bash