El PID de un proceso de bash child (imapsync): ¿cómo lo obtiene?

15

¿Alguien puede decirme cómo obtener el PID de un comando ejecutado en bash?

Por ejemplo, tengo un script bash que ejecuta imapsync.

Cuando se mata el script, el proceso imapsync no siempre se mata, por lo que me gustaría poder identificar el PID de imapsync programáticamente desde mi script, para poder matar el proceso imapsync yo mismo en un controlador de señal.

Entonces, ¿cómo obtengo programáticamente el PID de un proceso secundario de un script bash primario?

Jason Tan
fuente
1
¿Qué tal "pidof imapsync"? ¿Qué tiene de malo?
pitr
2
No sabía sobre pidof. Sin embargo, ahora que lo hago, no es útil para este escenario por lo que puedo decir, porque pidof parece devolver todos los procesos del comando dado en un sistema, incluso aquellos que pertenecen a otros scripts / usuarios. Además, imapsync es en realidad un script perl, por lo que estaría haciendo un pidof perl, que nuevamente es probable que devuelva procesos que no son imapsync y que pueden pertenecer a otros usuarios.
Jason Tan
Javier tiene razón. Esta página ofrecerá más información sobre ProcessManagement .
sinping

Respuestas:

4

imapsync tiene una opción para establecer dónde se escribe su pid:

--pidfile: el archivo donde se escribe imapsync pid.

Gilles LAMIRAL
fuente
Para su información, esto en realidad no responde a mi pregunta en un sentido general, pero descubrí el argumento --pidfile arg y, con algunas dudas, ha sido lo suficientemente bueno hasta ahora ...
Jason Tan
@JasonTan, ¿por qué enseñarle a un hombre a pescar, cuando puedes darle un sabroso filete precocido, así que regresa y te pide más, mañana, eh? perdón por la publicación anterior, pero ¿por qué aceptar esta respuesta sobre la de Javiers?
no sincronizado
46
any_command args &
my_child_PID=$!

IOW, al igual que $$contiene su PID, $!tiene el PID del comando de fondo ejecutado más recientemente .

Javier
fuente
¡Gracias, pero imapsync no está en segundo plano y $! no se establece si hago eco en la siguiente línea después de la invocación imapsync o la primera línea del controlador de señal. :-(
Jason Tan
66
Si bifurca y traspasa al niño, es responsabilidad de los padres guardar el PID del niño en algún lugar. la práctica habitual es guardarlo en algún lugar como /var/run/whatever.pid. Tal vez hay una opción de línea de comandos para pedirle que guarde el PID en alguna parte; si no, eso suena como una característica para preguntarle al autor o implementarlo usted mismo.
Javier
1
Énfasis en el fondo . Si no se ha colocado ningún proceso en segundo plano (es decir, con adjunto &), la $!variable no está definida.
Trevor
1
Se sugieren soluciones más similares en (una respuesta a) Cómo obtener pid del proceso recién iniciado ; Como complemento a esta respuesta, un comentario dice: ah, y el "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 de noviembre de 10 a las 14:28
imz - Ivan Zakharyaschev
10

A diferencia pidof, pgrepse le puede dar una variedad de opciones para restringir para qué procesos devuelve PID. Uno que puede ser particularmente útil es seleccionar con base en PPID usando el PID del proceso actual.

pgrep -P $$ imapsync

que solo generará PID de imapsync si son hijos de su script.

Pausado hasta nuevo aviso.
fuente
0

¿Qué hay de poner momentáneamente imapsync en segundo plano, obtener el PID y luego ponerlo en primer plano ... Algo así:

imapsync &
pid=$!
wait $pid
retVal=$?
marca
fuente