如何检测后台命令何时打印到 stderr?

如何检测后台命令何时打印到 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日志文件中的错误消息中,而又不总是吐出该计数器,也不会弄乱标准输出上的音频记录就像这个答案似乎做的那样? (或者它有吗?)

换句话说,日志文件中没有这样的内容,但计数器报告被取消注释:

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.

时间戳的具体格式并不重要,即使它在同一行,只要我仍然有原始错误消息和相对于记录发生的时间。

答案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"

相关内容