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