¿Fragmento de Bash por matar un proceso hasta que esté muerto?

8

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?

Rory
fuente
¿No quisiste decir ps -ef?
user1686
1
Gravedad: Eso es solo el estilo BSD frente a las opciones UNIX, pero ef parece encajar mejor con las opciones UNIX. Yo también iría con 'ps ao pid'
Kyle Brandt el
while [[ ps ef $PID ]]es un error de sintaxis Supongo que quisiste decir while ps ef $PID.
Dennis

Respuestas:

10

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:

 kill $PID
 wait $PID

En un sistema ideal, nunca tendrías que repetir un killproblema kill -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.

Andrew Aylett
fuente
1
Esto no funciona si el PID no pertenece a un proceso secundario, es decir, este script está tratando de controlar la ejecución de un proceso que se originó en otro lugar. Lo consigo bash: wait: pid 32137 is not a child of this shellcuando lo intento. :(
Justin Force
9

Para todos los que recomienden el paso de kill $PIDa kill -9 $PID, tendré que recordarles el uso inútil de kill -9 .

No no no. No uses kill -9.

No le da al proceso la oportunidad de limpiar:

  1. apague las conexiones del zócalo

  2. limpiar archivos temporales

  3. informar a sus hijos que se va

  4. restablecer sus características de terminal

Y así sucesivamente y así sucesivamente y así sucesivamente.

En general, envíe 15 y espere un segundo o dos, y si eso no funciona, envíe 2, y si eso no funciona, envíe 1. Si eso no funciona, ¡QUITE EL BINARIO porque el programa se comportó mal!

No uses kill -9. No saque la cosechadora solo para ordenar la maceta.

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í .

Adriano Varoli Piazza
fuente
0

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.

Kyle Brandt
fuente
Convenido. Si no responde y se cierra después de un SIGTERM (la señal enviada por defecto por kill), entonces probablemente no responda a un segundo, tercero, cuarto, ...., por lo que su próximo curso de acción debería ser SIGKILL (kill - 9) Por supuesto, debe asegurarse de que la X en "dormir X segundos" sea lo suficientemente larga como para permitir que el proceso realice una operación normal de limpieza y abandono del escritorio, incluso si el sistema está muy cargado; puede tomar una fracción de un segundo normalmente pero decenas de segundos cuando el sistema se está sacudiendo.
David Spillett el
0

Por lo general, quieres probar kill $PIDprimero,

luego déjelo dormir un poco para ver si sale con gracia.

Si no, ejecute kill -9 $PIDpara deshacerse de él con fuerza.

Brent
fuente
-1

por qué no solo

kill -9 $PID

Chris
fuente
2
Porque desea dar a los procesos la oportunidad de limpiar y morir bien, que es lo que hace la señal TERM (la señal predeterminada). La señal KILL ("-9") no le da a los procesos esa oportunidad.
ktower el
Buen punto, pero el póster original decía que solo quería matarlo.
chris