Bash: лучший способ для вывода на консоль и выходной файл, чем тройник?

2

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

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

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

tmp
источник
1
Это самостоятельно написанная программа? Если это так, вы можете попытаться очистить выходной буфер каждого блока или строк текста. По умолчанию выходной буфер записывается только когда буфер заполнен (или периодически? Я не уверен).
Kenneth L

Ответы:

1

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

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

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

 your_program | stdbuf -o0 tee

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

curious_cat
источник
1
Я думаю, что это должно быть stdbuf -o0 your_program | stdbuf -i0 -o0 tee полностью избавиться от буферизации
PSkocik
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 
wackazong
источник