Si, en bash
, ejecuto:
cmd1 | cmd2 | ... | cmdi | ... | cmdn &
donde cmd{1..n}
puede no ser distinto, ¿cómo obtengo el PID cmdi
? Alternativamente, ¿cómo puedo señalar el cmdi
proceso? (Por ejemplo, ¿enviarlo SIGUSR1
?)
pkill
/ pgrep
, pidof
Etc. no parecen buenas respuestas, ya que otras instancias de cmdi
ejecución tal vez, incluso como parte de la misma canalización. jobs -p
da el PID de cmd1
, para mí.
i
puede ser cualquier cosa adentro {1..n}
.
bash
shell
pipe
job-control
muru
fuente
fuente
cat /var/run/out | nc -l 8080
es solo superficialmente similar acmd1 | cmd2
? Su restricción, que desea escribir la tubería básica y luego recuperar los PID, (1) no se indica en la pregunta, y (2) es poco probable que permita una buena solución general.cmd1 | cmd2
Es un caso muy especial donde ambos PID son fácilmente obtenibles. ¿Dije algo sobre n? Entonces, ¿por qué asumirías n = 2? ¿Dije algo sobre lo que es cmdi? Entonces, ¿por qué asumirías que podría modificar cmdi? Estoy pidiendo una solución general y usted está imponiendo restricciones.Respuestas:
Para la versión original de la pregunta, cuando solo se deseaba el PID del último comando, la variable especial
$!
es perfecta.No hay un acceso fácil similar a los PID de los otros procesos.
Tomó mucho tiempo agregar
$pipestatus
(zsh) y$PIPESTATUS
(bash), finalmente nos dio acceso a todos los estados de salida en una tubería, además$?
del último que ha existido desde el shell Bourne original. Quizás con el$!
tiempo sucederá algo análogo .fuente
Creo que podrías hacer algo como se sugiere aquí .
Aquí, en el ejemplo anterior, recuperé el pid del tercer proceso canalizado y lo anoté en el archivo pid. Podría anotarlo para cualquier proceso canalizado.
fuente
jobs -p
. señalarlo conSIGPIPE
. ¿Quierescmdi
esto?Una solución no muy portátil y específica de Linux podría ser rastrear los procesos utilizando las tuberías que los conectan. Podemos obtener los PID de los comandos first (
jobs -p
) y last ($!
) en la tubería. Usando cualquiera de los PID, este script podría hacer el trabajo:fuente
Yo uso matrices de base cero aquí en este código. Solo ten cuidado con lo que corres
eval
.fuente