并行使用两个命令会混淆终端输出 - 如何避免这种情况?

并行使用两个命令会混淆终端输出 - 如何避免这种情况?

我想编写一个 bash 脚本,用于使用 dvdbackup 翻录大量 DVD 集。并行使用四个 DVD 驱动器,dvdbackup 的终端输出会混合在一起。

dvdbackup -Mv --progress --error=a -i /dev/sr0 -o /home/xxxx/vids/ &
dvdbackup -Mv --progress --error=a -i /dev/sr1 -o /home/xxxx/vids/

我需要终端输出来控制可能的错误。我该如何控制输出?对于这个问题,我很难在谷歌上找到匹配的搜索词...

提前致谢

答案1

使用GNU 并行你可以做:

parallel --line-buffer --tag 'dvdbackup -Mv --progress --error=a -i /dev/{1} -o /home/xxxx/vids/' ::: sr0 sr1

从它的手册来看:

--tag
    带参数的标记行。每个输出行都将添加参数和制表符 (\t)。

答案2

你不能。这些程序是并行运行的,因此它们同时写入终端。您可以做的是将每个实例的标准错误捕获到一个单独的文件中:

dvdbackup -Mv --progress --error=a -i /dev/sr0 -o /home/xxxx/vids/ 2>log1 &
dvdbackup -Mv --progress --error=a -i /dev/sr1 -o /home/xxxx/vids/ 2>log2

dvdbackup然后,您将获得第一个命令的错误/进度报告等log1以及第二个命令的错误/进度报告等log2


或者,如果您只想向其错误输出添加标签,您可以这样做:

dvdbackup -Mv --progress --error=a -i /dev/sr0 -o vids/ 3>&1 1>&2 2>&3 | 
    sed 's/^/Process A /' &  
dvdbackup -Mv --progress --error=a -i /dev/sr1 -o vids/ 3>&1 1>&2 2>&3 | 
    sed 's/^/Process B /' 

这会将字符串添加Process A到第一个进程打印到 stderr 的每行的开头,以及Process B打印到第二个进程的 stderr 的每行的开头。

例如:

$ seq 1 5 | sed 's/^/process A /' & seq 1 5 | sed 's/^/process B /'
[1] 1549053
process A 1
process A 2
process A 3
process A 4
process A 5
process B 1
process B 2
process B 3
process B 4
process B 5
[1]+  Done                    seq 1 5 | sed 's/^/process A /'

相关内容