Estoy tratando de escribir un script bash robusto, y en él creo un proceso en segundo plano. Al final del guión, quiero matarlo. Tengo su PID.
Estaba pensando en algo como esto
while [[ ps ef $PID ]] ; do
kill $PID
sleep 0.5
done
¿Alguna sugerencia para algo mejor? ¿Algún problema posible con este enfoque?
ps -ef
?while [[ ps ef $PID ]]
es un error de sintaxis Supongo que quisiste decirwhile ps ef $PID
.Respuestas:
El problema de matar repetidamente un proceso es que tienes una condición de carrera con la creación de un nuevo proceso. No es particularmente probable, pero es posible que el proceso salga y se inicie un nuevo proceso con el mismo PID mientras duerme.
¿Por qué tienes que matar repetidamente el proceso? Si es porque el proceso se cerrará, pero puede tardar un tiempo en salir después de recibir la señal, puede usar
wait
:En un sistema ideal, nunca tendrías que repetir un
kill
problemakill -9 $PID
. Si es necesario, es posible que desee considerar arreglar lo que sea que esté ejecutando para que no tenga que hacerlo. Mientras tanto, probablemente no alcanzará la condición de carrera, y puede protegerse contra ella (digamos) comprobando la marca de tiempo de / proc / $ PID / justo antes de finalizar el proceso. Sin embargo, eso es un mal truco.fuente
bash: wait: pid 32137 is not a child of this shell
cuando lo intento. :(Para todos los que recomienden el paso de
kill $PID
akill -9 $PID
, tendré que recordarles el uso inútil de kill -9 .Ahora, no estoy de acuerdo con "eliminar la parte binaria", pero la progresión parece menos dañina que solo a
kill -9
.También estoy de acuerdo con el cuidado de las condiciones de carrera en la creación de nuevos procesos con el mismo PID mencionado aquí .
fuente
Primero mata normalmente, duerme x número de segundos y luego mata -9 si todavía está alrededor Además, esto parece una situación extraña en la que te has metido, quizás quieras explicarnos el problema más grande.
fuente
Por lo general, quieres probar
kill $PID
primero,luego déjelo dormir un poco para ver si sale con gracia.
Si no, ejecute
kill -9 $PID
para deshacerse de él con fuerza.fuente
por qué no solo
kill -9 $PID
fuente