La secuencia de comandos Bash solo debería eliminar las instancias de otra secuencia de comandos que ha lanzado


11

En la situación actual, un determinado script 'calling.sh' lanza otro script 'called.sh' en segundo plano, realiza otras operaciones, duerme por un tiempo y luego termina 'called.sh' con un pkill called.sh. Esto funciona bien

Entonces, también me gustaría lanzar 'called.sh' desde otros terminales como un script independiente en cualquier otro momento, ya sea antes o después de iniciar call.sh. Estas instancias independientes no deben eliminarse mediante 'calling.sh'.

¿Cómo puedo conseguir esto? La intuición dice que el script de llamada debería poder distinguir el proceso que comenzó de cualquier otro homónimo que se esté ejecutando mientras tanto.

Como variante, 'calling.sh' también puede lanzar 'called', que es un enlace simbólico a 'called.sh'. ¿Esto complica la gestión de la situación anterior? ¿Qué precauciones y ajustes específicos requiere el uso de un enlace simbólico?


1
Creo que unshare es específicamente para esto: unix.stackexchange.com/a/450242/323121
Rusi

Respuestas:


27

No uses el nombre para matarlo. Dado que el calling.shscript está llamando al proceso que luego desea eliminar, solo use $!(from man bash):

! Se expande al ID de proceso del trabajo colocado más recientemente en segundo plano, ya sea ejecutado como un comando asincrónico o utilizando el comando bgincorporado

Entonces, si eres así calling.shes:

called.sh &
## do stuff
pkill called.sh

Cámbialo a esto:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"

44
Esto debería funcionar siempre que se llame a .sh no muera por sí solo, porque de lo contrario su pid podría ser reutilizado, matando como resultado un proceso inocente y no relacionado.
Eugene Ryabtsev

2
@EugeneRyabtsev, ese es un muy buen punto. Supongo que también podrías comprobar que el $calledPidPID principal del PID es el PID de called.sh.
terdon

Para reforzar la respuesta, este es otro recurso que encontré útil para organizar mis pensamientos: mywiki.wooledge.org/ProcessManagement
XavierStuvw

18

He tenido que elegir esto, pero de los guiones tantas veces; Es aún más divertido cuando los scripts se llaman como parte de un programa automatizado complejo. Realmente no deberías confiar en algo como pkillseleccionar qué script matar.

Dentro de call.sh, debe registrar los PID de los trabajos que ha iniciado y eliminarlos explícitamente mediante PID.

Dentro de llamadas.sh:

./called.sh &
called_pid=$!

# Later
kill $called_pid
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.