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 cmdiproceso? (Por ejemplo, ¿enviarlo SIGUSR1?)
pkill/ pgrep, pidofEtc. no parecen buenas respuestas, ya que otras instancias de cmdiejecución tal vez, incluso como parte de la misma canalización. jobs -pda el PID de cmd1, para mí.
ipuede ser cualquier cosa adentro {1..n}.
bash
shell
pipe
job-control
muru
fuente
fuente

cat /var/run/out | nc -l 8080es 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 | cmd2Es 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. ¿Quierescmdiesto?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