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

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

Если я перенаправляю на вывод в файл '> out.txt', я в конечном итоге получаю весь вывод, но он буферизуется, поэтому я больше не вижу, что он делает сейчас.

Есть ли способ перенаправить вывод, но не буферизировать записи?

8 ответов

Вы можете явно установить параметры буферизации стандартных потоков, используя setvbuf вызвать в C (см. эту ссылку), но если вы пытаетесь изменить поведение существующей программы, попробуйте stdbuf (часть coreutils начиная с версии 7.5, видимо).

Это буферы stdout до линии:

stdbuf -oL command > output

Это отключает stdout в целом буферизация:

stdbuf -o0 command > output

Вы можете получить линейный буферизованный вывод в файл, используя 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

На Ubuntu unbuffer программа (из expect-dev) пакет сделал свое дело для меня. Просто беги:

unbuffer your_command

и это не буферизует это.

Самое простое решение, которое я нашел (не нужно было устанавливать какие-либо сторонние пакеты), было упомянуто в аналогичной теме на сайте 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 команда; если ваша система имеет его, он принимает имя файла в качестве аргумента, весь текст, выгруженный на стандартный вывод, копируется в файл. Это очень полезно, когда программа установки требует взаимодействия.

Лично я предпочитаю вывод команды, которую я хочу просмотреть tee,

script записывает слишком много информации, включая время нажатия клавиш, и много непечатаемых символов. Какие tee Сэйвс гораздо более читабелен для меня.

Вы можете использовать tee команда, просто магия!

someCommand | tee logFile.log оба отобразятся в консоли и запишутся в файл журнала.

Перенаправить вывод в файл и следовать за файлом с tail -f команда.

редактировать

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

Другие вопросы по тегам