У меня есть длительный пакетный процесс, который выводит некоторую отладочную и обрабатывающую информацию в стандартный вывод. Если я просто бегу с терминала, я могу отслеживать, «где это», но тогда данных становится слишком много и они прокручиваются за пределы экрана.
Если я перенаправляю вывод в файл '> out.txt', я в конечном итоге получаю весь вывод, но он буферизуется, поэтому я больше не могу видеть, что он делает прямо сейчас.
Есть ли способ перенаправить вывод, но не буферизовать его записи?
Вы можете явно установить параметры буферизации стандартных потоков, используя setvbuf
позвонить в C (см. эта ссылка), но если вы пытаетесь изменить поведение существующей программы, попробуйте stdbuf
(часть coreutils
начиная с версии 7.5 видимо).
Это буферизует stdout
до строки:
stdbuf -oL command > output
Это отключает stdout
буферизация в целом:
stdbuf -o0 command > output
В Ubuntu unbuffer
программа (из expect-dev
) пакет помог мне. Просто беги:
unbuffer your_command
и он не буферизует его.
Вы можете получить строковый буферизованный вывод в файл, используя script
команда так:
stty -echo -onlcr # avoid added \r in output
script -q /dev/null batch_process | tee output.log # Mac OS X, FreeBSD
script -q -c "batch_process" /dev/null | tee output.log # Linux
stty echo onlcr
Самое простое решение, которое я нашел (не требовалось устанавливать какие-либо сторонние пакеты), было упомянуто в аналогичной ветке на Unix и Linux сайт: используйте script
команда. Он старый и, вероятно, уже установлен.
$ script -q /dev/null long_running_command | print_progress # FreeBSD, Mac OS X
$ script -q -c "long_running_command" /dev/null | print_progress # Linux
Обратите внимание, что первый параметр имени файла для script
команда - файл журнала для записи. Если вы просто запустите script -q your_command
, вы замените команду, которую вы вводили для запуска, с файлом журнала. Проверьте man script
, на всякий случай, прежде чем попробовать.
попробуйте script
команда; если в вашей системе он есть, он принимает имя файла в качестве аргумента, весь текст, выгружаемый в stdout, копируется в файл. Это очень полезно, когда программа установки требует взаимодействия.
Лично я предпочитаю конвейерный вывод команды, которую хочу изучить через tee
.
script
записывает слишком много информации, включая время нажатия клавиш, и много непечатаемых символов. какой tee
saves для меня гораздо удобнее для чтения.
Перенаправьте вывод в файл и следуйте за файлом с tail -f
команда.
редактировать
Если это по-прежнему страдает от буферизации, используйте средство системного журнала (которое обычно не буферизуется). Если пакетный процесс выполняется как сценарий оболочки, для этого можно использовать команду logger. Если пакетное задание выполняется на языке сценариев, в любом случае должна быть возможность ведения журнала.
Вы можете использовать tee
команда, просто волшебство!
someCommand | tee logFile.log
воля обе отобразить в консоли и записать в файл журнала.