Eu quero executar uma sequência de pipelines de comando pv
em cada um. Aqui está um exemplo:
for p in 1 2 3
do
cat /dev/zero | pv -N $p | dd of=/dev/null &
done
Os comandos reais no pipe não importam ( cat
/ dd
são apenas um exemplo)...
O objetivo é 4 pipelines em execução simultânea, cada um com sua própria pv
saída. No entanto, quando tento fazer os comandos em segundo plano como este, pv
para e tudo o que recebo são 4 trabalhos parados. Eu tentei com {...|pv|...}&
, bash -c "...|pv|..." &
todos com o mesmo resultado.
Como posso executar vários pv
pipelines de comando simultaneamente?
Descobri que posso fazer isso com
xargs
e a-P
opção:Envie a saída da matriz para iterar em stdin de
xargs
; Para executar todos os comandos simultaneamente, use-P 0
pv
não pode ser iniciado em segundo plano.Como você pode ver no
src/main/main.c
arquivo dopv
código-fonte do , eles estão definindo oTOSTOP
sinalizador no terminal comtcsetattr()
(noc.c_lflag
datermios
estrutura). Eles estão fazendo isso para receber umSIGTTOU
ao tentar escrever no terminal quando não estiver em primeiro plano, pegá-lo com um manipulador de sinal e redirecionar a saída para/dev/null
não "estragar" o terminal.Obviamente, isso é nojento, porque não define esse sinalizador apenas para si, mas para todos os programas que usam o terminal.
Mas isso não é tudo. Conforme explicado no manual da glibc :
Eles não estão bloqueando ou ignorando o
SIGTTOU
. E eles também não estão verificando o valor de retorno detcsetattr()
(que retornaria -1 e definidoerrno
comoEINTR
se eles tivessem definido oSIGTTOU
manipulador de sinal antes).Assim, o processo é interrompido. Se receber um
SIGCONT
(a partir dobg
comando), ele irá parar novamente ao tentar completar otcsetattr()
.Então eu acho que você deve considerá-lo um recurso ;-)