У меня есть длительный пакетный процесс, который выводит некоторую информацию отладки и процесса на стандартный вывод. Если я просто запускаю из терминала, я могу отслеживать «где он находится», но тогда данные становятся слишком большими и прокручиваются за пределы экрана.
Если я перенаправляю на вывод в файл '> out.txt', я в конечном итоге получаю весь вывод, но он буферизуется, поэтому я больше не вижу, что он делает сейчас.
Есть ли способ перенаправить вывод, но не буферизировать записи?
Ответы:
Вы можете явно установить параметры буферизации стандартных потоков, используя
setvbuf
вызов в C (см. Эту ссылку ), но если вы пытаетесь изменить поведение существующей программы, попробуйтеstdbuf
(coreutils
очевидно, что это начинается с версии 7.5).Это буферизует
stdout
до строки:Это полностью отключает
stdout
буферизацию:источник
./configure && make
плата за проезд. После этого вам даже не нужно устанавливать его, вы можете простоstdbuf
отключить бинарный файлsrc/
.Вы можете получить буферизованный вывод в файл, используя
script
команду следующим образом:источник
batch_process
если вы добавляете&
команду выше, по крайней мере на моем компьютере с Linux), что кажется как чрезвычайно распространенный вариант использования, и б) здесь нет объяснения того, как работает это заклинание.В Ubuntu пакет с
unbuffer
программой (изexpect-dev
пакета) помог мне. Просто беги:unbuffer your_command
и это не буферизует это.
источник
Самое простое решение, которое я нашел (не нужно было устанавливать какие-либо сторонние пакеты), было упомянуто в аналогичной теме на сайте Unix & Linux : используйте
script
команду. Он старый и, вероятно, уже установлен.Обратите внимание, что первым параметром имени файла для
script
команды является записываемый файл журнала . Если вы просто запуститеscript -q your_command
, вы перезапишете команду с отступом для запуска с файлом журнала. Проверьтеman script
, чтобы быть в безопасности, прежде чем пытаться это.источник
попробуйте
script
команду; если ваша система имеет его, он принимает имя файла в качестве аргумента, весь текст, выгруженный на стандартный вывод, копируется в файл. Это очень полезно, когда программа установки требует взаимодействия.источник
Лично я предпочитаю вывод команды, которую я хочу изучить
tee
.script
записывает слишком много информации, включая время нажатия клавиш, и много непечатаемых символов. То, чтоtee
спасает, гораздо более читабельно для меня.источник
tee
это также влияет на буферизацию. Я часто до сих пор получаю частичные строки, отображаемые при разбиении выводаfind
команд.Перенаправьте вывод в файл и выполните файл с помощью
tail -f
команды.редактировать
Если это все еще страдает от буферизации, тогда используйте средство системного журнала (которое обычно небуферизовано). Если пакетный процесс выполняется как сценарий оболочки, вы можете использовать команду logger для этого. Если пакетное задание выполняется на языке сценариев, в любом случае должна быть возможность ведения журнала.
источник
This answer is useful
за ответы, которые не работают и не могут работать?Вы можете использовать
tee
команду, просто волшебство!someCommand | tee logFile.log
оба отобразятся в консоли и запишутся в файл журнала.источник
tee
не остановит буферизацию.tee
не избежит некоторой буферизации, но только позволит вам посмотреть, что выводится. Это то, что хотел @JamesDean (как я не понял его вопрос), но я думаю, что буферизация здесь не является проблемой. Если у вас есть более подробная информация, дайте мне знать.tee
чтобы получить лучшее представление о выходных данных, которые вы не получаете?>
вы ничего не видите на консоли. Я думаю, @JamesDean использует слово «буферизация», чтобы описать это. Я отправлю комментарий на его вопрос, чтобы он сказал больше о том, чего он хочет.