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


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

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

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


46
2017-07-26 14:34


Источник


Не могли бы вы взглянуть на мои дебаты (и @cnst) ниже, я предполагаю, что единственное, что вы хотите, - это увидеть вывод в то же время, что и запись его в файл. Если вы нашли решение, сообщите нам об этом;)! - Benj
более высокий вопрос unix.stackexchange.com/questions/25372 - Trevor Boyd Smith


Ответы:


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

Эти буферы stdout до строки:

stdbuf -oL command > output

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

stdbuf -o0 command > output

46
2017-07-27 15:41



aaarghhh ... У моего Ubuntu есть только 7.4 coreutils ... :( - Calmarius
@Calmarius: компиляция coreutils должна быть довольно простой. Просто возьмите новую версию из ftp.gnu.org/gnu/coreutilsи дать ему идти. Это стандартный ./configure && make плата за проезд. Вам даже не нужно устанавливать его впоследствии, вы можете просто использовать stdbuf двоичный src/, - Eduardo Ivanec
двойной арг. Мне нужно это на старый centos distro AND OSX, а также Ubuntu. - edk750
более верный ответ unix.stackexchange.com/a/25378/5510 - Trevor Boyd Smith


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

8
2018-01-31 15:13



-1, потому что: a) в отличие от принятого ответа это не работает, если вы хотите запустить команду в фоновом режиме (команда немедленно завершается без завершения batch_process если вы добавите & к команде выше, по крайней мере на моем Linux-боксе), который кажется чрезвычайно распространенным случаем использования, и б) здесь нет объяснения того, как это заклинание работает. - Mark Amery


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

unbuffer your_command 

и он не будет его буферировать.


7
2018-02-18 11:48





Самое легкое решение, которое я нашел (не нуждалось в каких-либо пакетах сторонних производителей), было упомянуто в аналогичном потоке 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 command - записываемый файл журнала, Если вы просто запускаете script -q your_command, вы перезапишите команду, которую вы отступали для запуска с файлом журнала. Проверьте man script, чтобы быть в безопасности, прежде чем попробовать его.


4
2018-04-17 03:57





попробуйте script команда; если ваша система имеет это, оно принимает имя файла в качестве аргумента, весь текст, сбрасываемый в stdout, копируется в файл. Это очень полезно, когда программа установки требует взаимодействия.


2
2017-07-26 14:49



Я знаю трюк «script -a out.txt». Мне было интересно, есть ли другой способ сделать процесс записи не буферным. - James Dean


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

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


2
2017-07-26 14:51



Я также добавил бы «| less» в командную строку. - HUB
Я уверен, что tee также зависит от буферизации. Я часто получаю частичные линии, отображаемые тройником при расщеплении вывода из find команды. - Magellan


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

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

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


1
2017-07-26 16:47



Это то, что я делаю прямо сейчас, но процесс буферизует запись в файл, и это именно то, чего я хочу избежать. - James Dean
См. Мое изменение для обновленного предложения. - wolfgangsz
Это не работает по понятным причинам. Кто, черт возьми, выдает This answer is useful для ответов, которые не работают, и не могут работать? - cnst