pv
我想在每个命令管道上运行一系列命令管道。这是一个例子:
for p in 1 2 3
do
cat /dev/zero | pv -N $p | dd of=/dev/null &
done
管道中的实际命令无关紧要(cat
/dd
只是一个例子)......
目标是 4 个同时运行的管道,每个管道都有自己的pv
输出。但是,当我尝试对这样的命令进行后台处理时,pv
停止并且我得到的只是 4 个停止的作业。我试过了{...|pv|...}&
,bash -c "...|pv|..." &
结果都是一样的。
如何同时运行多个pv
命令管道?
发现我可以使用
xargs
以下-P
选项执行此操作:发送数组的输出以迭代到标准输入
xargs
;要同时运行所有命令,请使用-P 0
pv
无法在后台启动。正如您在源代码的
src/main/main.c
文件中看到的那样pv
,他们在TOSTOP
终端上设置标志tcsetattr()
(在c.c_lflag
结构中termios
)。他们这样做是为了SIGTTOU
在不在前台时尝试写入终端时接收 a,用信号处理程序捕获它,并将输出重定向到/dev/null
,以免“弄乱”终端。这当然很糟糕,因为它不仅为自己设置了该标志,还为使用终端的所有程序设置了该标志。
但这还不是全部。如 glibc手册中所述:
他们没有阻止或忽略
SIGTTOU
. 而且他们也没有检查(如果他们之前设置了信号处理程序tcsetattr()
,它将返回 -1 并设置errno
为)的返回值。EINTR
SIGTTOU
因此该过程停止。如果它收到一个
SIGCONT
(来自bg
命令),它将在尝试完成时再次停止tcsetattr()
。所以我想你应该把它当作一个功能;-)