Se, em bash
, eu executar:
cmd1 | cmd2 | ... | cmdi | ... | cmdn &
onde o cmd{1..n}
pode não ser distinto, como obtenho o PID cmdi
? Como alternativa, como posso sinalizar o cmdi
processo? (Por exemplo, enviar SIGUSR1
?)
pkill
/ pgrep
, pidof
Etc. não parecem boas respostas, pois outras instâncias cmdi
podem estar em execução, inclusive como parte do mesmo pipeline. jobs -p
dá o PID de cmd1
, para mim.
i
pode ser qualquer coisa {1..n}
.
bash
shell
pipe
job-control
muru
fonte
fonte
cat /var/run/out | nc -l 8080
é apenas superficialmente semelhante acmd1 | cmd2
? Sua restrição de que você deseja digitar o pipeline de esqueleto e depois recuperar os PIDs (1) não é declarada na pergunta e (2) dificilmente permitirá uma solução boa e geral.cmd1 | cmd2
é um caso muito especial em que ambos os PIDs são facilmente obtidos. Eu disse alguma coisa sobre n? Então, por que você assumiria n = 2? Eu disse alguma coisa sobre o que é cmdi? Então, por que você acha que eu poderia modificar o cmdi? Estou pedindo uma solução geral e você está impondo restrições.Respostas:
Para a versão original da pergunta, quando apenas o PID do último comando foi desejado, a variável especial
$!
é perfeita.Não há acesso fácil semelhante aos PIDs dos outros processos.
Demorou muito tempo para adicionar
$pipestatus
(zsh) e$PIPESTATUS
(bash), finalmente nos dando acesso a todos os status de saída em um pipeline, além$?
do último que existe desde o shell Bourne original. Talvez algo análogo aconteça$!
eventualmente.fonte
Eu acho que você poderia fazer algo como sugerido aqui .
Aqui no exemplo acima, eu recuperei o pid do terceiro processo canalizado e o anotei no pid do arquivo. Eu poderia anotá-lo para qualquer processo canalizado.
fonte
jobs -p
. sinalize comSIGPIPE
. Você quercmdi
isso?Uma solução específica para Linux, não muito portátil, pode ser rastrear os processos usando os pipes que os conectam. Podemos obter os PIDs do primeiro (
jobs -p
) e do último ($!
) comando no pipeline. Usando um PID, este script pode fazer o trabalho:fonte
Eu uso matrizes baseadas em zero aqui neste código. Apenas tome cuidado com o que você administra
eval
.fonte