Как обнаружить, когда фоновая команда печатает к stderr?

У меня есть этот (частичный) сценарий для записи аудио:

#!/bin/sh
...
echo Recording to "$REC_FILE"
arecord [options] > "$REC_FILE" &
ARECORD_PID=$!

SYNC_COUNT=1
while kill -0 "$ARECORD_PID" > /dev/null 2>&1
do
        sleep 1
#        echo $SYNC_COUNT seconds
        sync
        SYNC_COUNT=$(($SYNC_COUNT+1))
done
echo Recording to "$REC_FILE" has ended.

с которым называют record.sh >> "$LOGFILE" 2>&1 &

Причина в течение 1 секунды <number> seconds отчет состоит в том потому что arecord не печатает информации синхронизации с ее сообщениями об ошибках на stderr. Таким образом только с, что для продолжения я должен просмотреть или слушать всю запись, которая могла бы быть несколько часов длиной, чтобы попытаться найти то, что может или не может быть проблемой.

Я устранил ту непосредственную проблему путем печати 1 секунды в противоречии с тем же файлом журнала так, чтобы сообщение об ошибке закончилось с сырой меткой времени выше и ниже его в файле, но это действительно загромождает вещи, потому что это всегда работает, даже когда вещи работают просто великолепно.

Как я могу добавить приведенную стоимость этого в противоречии с arecordсообщения об ошибках в файле журнала, всегда не извергая тот счетчик, и не портя аудиозапись на stdout как этот ответ, казалось бы, сделали бы? (или он?)

Другими словами, вместо этого в файле журнала, со встречным непрокомментированным отчетом:

Recording to rec.wav
1 seconds
2 seconds
3 seconds
4 seconds
...
5093 seconds
arecord hiccuped but is still running
5094 seconds
...
10283 seconds
10284 seconds
Recording to rec.wav has ended.

Я хочу что-то вроде этого:

Recording to rec.wav
At 5093 seconds, arecord hiccuped but is still running
Recording to rec.wav has ended.

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

0
задан 13 April 2017 в 05:24

1 ответ

Используйте ts утилита (от moreutils пакет) для добавления метки времени к выводу:

If the -i or -s switch is passed, ts timestamps incrementally instead.
In case of -i, every timestamp will be the time elapsed since the last
timestamp. In case of -s, the time elapsed since start of the program
is used.  The default format changes to "%H:%M:%S", and "%.S" and "%.s"
can be used as well.

Так, выполненный:

record.sh |& ts -s >> "$LOGFILE"
2
ответ дан 7 November 2019 в 03:36

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

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