stdbuf не працює, поки виконує розблокування


6

Я намагаюся застосувати часові позначки до stdout процесу. Для належних застосованих часових позначок я намагаюся unbuffer промальовувати процес. Це працює з, unbufferале не з тим, stdbufяк я б очікував. Розглянемо наступний сценарій повільного друку ' slowprint ':

#!/bin/bash

if [ $# -ne 2 ]; then
   echo "usage: ${0%%/*} <file> <delay in microseconds>"
   exit 1
fi

DELAY=$2 perl -pe 'BEGIN{use Time::HiRes qw(usleep)} { usleep($ENV{DELAY}) }' $

тепер порівняйте наступні спроби застосування часових позначок:

stdbuf -oL ./slowprint <(ls) 100000 | 
awk '{ print strftime("%H:%M:%S"), $0; fflush(); }'

проти

unbuffer ./slowprint <(ls) 100000 | 
awk '{ print strftime("%H:%M:%S"), $0; fflush(); }' 

Другий працює для мене, тоді як перший - ні, хоча я очікую, що вони зроблять те саме. Наразі unbufferвін непридатний, оскільки він ковтає коди помилок за певних обставин (я розмістив окреме запитання щодо такої поведінки ).


Знищений: perlдозволяє сценаріям робити досить низький рівень вводу / виводу, і я думаю (але я не впевнений), що впливає на буферизацію. Тут ви можете змінити це значення, встановивши $|=1або з ефектом "англійська" $OUTPUT_AUTOFLUSH=1. Це, звичайно, не спрацює з неперевершеним, але у вас може не виникнути проблем з неперловою програмою.
dave_thompson_085

Відповіді:


1

Спробуйте annotate-output. Він надає часові позначки для STDIN , STDOUT та STDERR .

Наприклад, використовуйте wcдля підрахунку рядків bash підстановку процесу (один рядок) та неіснуючий файл:

annotate-output wc -l <(echo foo) nosuchfile

Вихід:

10:17:45 I: Started wc -l /dev/fd/63 nosuchfile
10:17:45 O:       1 /dev/fd/63
10:17:45 E: wc: nosuchfile: No such file or directory
10:17:45 O:       1 total
10:17:45 I: Finished with exitcode 1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.