¿Cómo finalizo todos los procesos con el mismo nombre de una manera más suave que lo killall
hace? No quiero interrumpir los procesos, pero les dejo tiempo para salir correctamente.
Ver también:
¿Cómo elimino procesos en Ubuntu?
En el monitor del sistema, ¿cuál es la diferencia entre Kill Process y End Process?
command-line
process
kill
killall
loco por natty
fuente
fuente
Respuestas:
1. `killall` ya es agradable (SIGTERM)
killall
por defecto envíaSIGTERM
. Este ya es el buen enfoque que deja a las aplicaciones la oportunidad de limpiar después de sí mismas. El "ve a morir ya, ahora mismo!" enfoque es enviar unaSIGKILL
señal, que requiere especificar eso como una opción parakillall
. De la Biblioteca GNU C: Señales de terminación :2. El "proceso de finalización" de System Monitor es igualmente agradable (SIGTERM, también)
Tiene un enlace a una pregunta sobre el Monitor del sistema GNOME. Eso también sirve
SIGTERM
para su acción de "Fin del proceso" (y me doy cuenta de que estoy contradiciendo la respuesta a esa pregunta). Puede encontrarlo en el código fuente para verificar usted mismo:data / menus.ui :
El 15 aquí es el número de señal. La señal 15 es
SIGTERM
. Y System Monitor ha utilizadoSIGTERM
mucho antes de que se hiciera y respondiera esa otra pregunta.Anexo técnico (en respuesta a un comentario)
Mirando a través de la representación de Github
git blame
, aquí están los cambios que se han realizado en cómo se deletrean las señales en el código fuente de GNOME System Monitor:383007f2 24 de julio de 2013 Código duplicado reemplazado para enviar señales con parámetros
GAction 0e766b2d 18 de julio de 2013 Menú emergente del proceso de puertos a GAction
97674c79 3 de octubre de 2012 Deshacerse de la estructura
ProcData 38c5296c 3 de julio de 2011 Hacer que la sangría sea uniforme en los archivos de origen.
Ninguno de estos cambió de
SIGQUIT
aSIGTERM
, y ese último fue antes de que se hiciera la pregunta vinculada.fuente
15
? Es posible que haya cambiado en algún momento, por lo que la respuesta anterior podría ser 100% correcta con respecto a una versión anterior.git grep 'SIGQUIT'
no revela nada. Tampoco se encuentra nada relacionado con las señalesgit grep '>3<'
. Concluyo que lo más probable es que gnome-system-monitor nunca haya usadoSIGQUIT
.git grep
solo busca en el árbol actual, no en todo el historial. He utilizadogit blame
(en realidad el equivalente Github) para profundizar un poco más, pero aún nada.La respuesta de @hvd es básicamente correcta. Para respaldar eso aún más, el
init
proceso primero se enviaráSIGTERM
a los procesos cuando esté apagando su computadora, luego, después de un retraso, se enviaráSIGKILL
si aún no han salido. Los procesos no pueden manejar / ignorarSIGKILL
.Sin embargo, para dar un poco más de detalle, la respuesta real es que no tiene forma de saber con certeza si el programa lo maneja.
SIGTERM
es la señal más habitual para pedir cortésmente que un programa se cierre, pero todo el manejo de la señal depende de que el programa haga algo con la señal.Para decirlo de otra manera, según las otras respuestas, si tuviera un programa escrito por @Jos o por @AlexGreg, presumiblemente estarían manejando
SIGQUIT
pero posiblemente noSIGTERM
, y porSIGTERM
lo tanto el envío sería menos "suave" queSIGQUIT
.He escrito un código para que puedas jugarlo tú mismo. Guarde lo siguiente como
signal-test.c
, luego compile conLuego puede ejecutarlo
./signal-test
y ver qué sucede cuando envía diferentes señales conkillall -s <signal>
.Tal como está, el código maneja tanto SIGTERM como SIGQUIT con gracia. Puede intentar comentar las líneas
signal(SIG...
(utilizando un//
al comienzo de la línea) para eliminar el controlador de señal, luego ejecutar y enviar las señales nuevamente. Debería poder ver estas diferentes salidas:dependiendo de si manejas las señales o no.
También podría intentar ignorar las señales:
Si haces eso, el envío
SIGTERM
no hará nada, tendrás que usarloSIGKILL
para finalizar el proceso.Más detalles en
man 7 signal
. Tengasignal()
en cuenta que el uso de esta manera se considera no portátil, ¡aunque es mucho más fácil que la alternativa!Otra nota al pie de página menor: sobre los
killall
intentos de Solaris de matar todos los procesos. Todos ellos. Si lo ejecutas como root, te sorprenderás :)fuente
pkill
. La otra razón es que se emparejapgrep
, lo que hace que sea más fácil verificar exactamente qué procesos se eliminarán y cuál tiene una semántica que coincida mejor queps | grep
."Fin de todo" sería
killall -s SIGQUIT [process name]
. Si desea una solución elegante, definaalias endall='killall -s SIGQUIT'
.fuente
SIGQUIT
es como hacer el procesoabort(3)
: descarga el núcleo y luego mata el proceso. Esto no es de ninguna manera más agradable / gentil / amable de loSIGTERM
que está predeterminadokillall
.SIGQUIT
(o incluso mejorSIGINT
) , podría tratarse más 'suavemente' queSIGTERM
, pero esto depende de la aplicación. Sin control, ninguno de ellos causa la terminación inmediata.