Назад | Перейти на главную страницу

Есть ли способ перенаправить вывод в файл без буферизации в unix / linux?

У меня есть длительный пакетный процесс, который выводит некоторую отладочную и обрабатывающую информацию в стандартный вывод. Если я просто бегу с терминала, я могу отслеживать, «где это», но тогда данных становится слишком много и они прокручиваются за пределы экрана.

Если я перенаправляю вывод в файл '> 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 воля обе отобразить в консоли и записать в файл журнала.