Существует ли способ перенаправить вывод в файл, не буферизуя на unix/linux?

Можно или продвинуть его через WSUS, или Вы испытываете необходимость для загрузки его с MS (предпочтительный для центральной доли программного обеспечения, таким образом, только необходимо загрузить однажды), и продвиньте его через GPO/SCCM/some другое решение для установки. или вручную установите его.

49
задан 26 July 2011 в 17:34
8 ответов

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

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

stdbuf -oL command > output

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

stdbuf -o0 command > output
52
ответ дан 28 November 2019 в 19:37

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

4
ответ дан 28 November 2019 в 19:37

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

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

3
ответ дан 28 November 2019 в 19:37

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

Править

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

2
ответ дан 28 November 2019 в 19:37

В Ubuntu программа unbuffer (из пакета expect-dev ) помогла мне. Просто запустите:

unbuffer your_command

, и он не буферизует его.

8
ответ дан 28 November 2019 в 19:37

Вы можете добиться вывода строчной буферизации в файл, используя команду 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
9
ответ дан 28 November 2019 в 19:37

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

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

1
ответ дан 28 November 2019 в 19:37

Самое простое решение, которое я нашел (не требовалось устанавливать какие-либо сторонние пакеты), было упомянуто в аналогичной ветке на сайте Unix и Linux : используйте сценарий команда. Он старый и, вероятно, уже установлен.

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

6
ответ дан 28 November 2019 в 19:37

Теги

Похожие вопросы