Мне нужно периодически обновлять журнал. Это блок из примерно 10 строк текста. Я использую тройник, и он работает прямо сейчас. Тем не менее, производительность менее удовлетворительная. Он ждет некоторое время, а затем выводит несколько блоков текста из нескольких обновлений (особенно, когда программа только начинается, требуется довольно много времени, чтобы начать отображать что-либо на консоли, и когда я впервые увидел это, я подумал, что программа зависла). Кроме того, он разбивается случайным образом в середине последнего блока, поэтому показывать его довольно уродливо.
Есть ли способ улучшить это? (Может выводить меньше каждый раз и чаще переключаться между выходным файлом и консолью?)
Обновить : Вот что сейчас находится в моем скрипте bash: tail -f /var/log/syslog | egrep --line-buffered "my search string" > tmp.txt & python script.py | tee result.log
Ответы:
Я думаю, что ваша проблема проистекает из фундаментальной особенности каналов, то есть буферизации.
Обходные пути являются грязными, но вы должны смотреть на команды как
unbuffer
или жеscript
или жеstdbuf
,Возможно, что-то, чтобы остановить буферизацию вывода, например:
PS. Я сейчас не на консоли, поэтому я не могу попробовать это.
источник
stdbuf -o0 your_program | stdbuf -i0 -o0 tee
полностью избавиться от буферизацииЯ использую группирование команд и перенаправляю вывод в подстановку процесса. Внутри я передаю его в / dev / tty и stdout. Затем я перенаправляю stdout и stderr в файл. У меня пока работает. Вы можете легко добавить к выводу временную метку и идентификатор процесса, если хотите.
источник