script

script

Мне нужно отобразить периодически обновляемый журнал. Это блок примерно из 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

Связанный контент