Réponse courte : Envoyer SIGTERM
, 30 secondes plus tard, SIGKILL
. Autrement dit, envoyez SIGTERM
, attendez un peu (cela peut varier d'un programme à l'autre, vous connaissez peut-être mieux votre système, mais 5 à 30 secondes suffisent. Lors de l'arrêt d'une machine, vous pouvez la voir attendre automatiquement jusqu'à 1'30s. Pourquoi la hâte, après tout?), Puis envoyez SIGKILL
.
Raisonnable Réponse : SIGTERM
, SIGINT
, SIGKILL
C'est plus que suffisant. Le processus se terminera très probablement avant SIGKILL
.
Réponse longue : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
,SIGKILL
Cela n'est pas nécessaire, mais au moins vous n'induisez pas en erreur le processus concernant votre message. Tous ces signaux ne signifient que vous voulez que le processus pour arrêter ce qu'il fait et la sortie.
Quelle que soit la réponse que vous choisissez dans cette explication, gardez cela à l'esprit!
Si vous envoyez un signal qui signifie autre chose, le processus peut le gérer de manière très différente (d'une part). D'un autre côté, si le processus ne gère pas le signal, peu importe ce que vous envoyez après tout, le processus s'arrêtera de toute façon (lorsque l'action par défaut est de se terminer, bien sûr).
Donc, vous devez penser comme vous-même en tant que programmeur. Coderiez-vous un gestionnaire de fonctions pour, disons, SIGHUP
quitter un programme qui se connecte à quelque chose, ou le feriez-vous en boucle pour essayer de vous connecter à nouveau? Telle est la question principale ici! C'est pourquoi il est important d'envoyer simplement des signaux qui signifient ce que vous souhaitez.
Réponse longue presque stupide :
Le tableau ci-dessous contient les signaux pertinents et les actions par défaut au cas où le programme ne les gère pas.
Je les ai commandés dans l'ordre que je suggère d'utiliser (BTW, je vous suggère d'utiliser la réponse raisonnable , pas celle-ci ici), si vous avez vraiment besoin de tous les essayer (ce serait amusant de dire que la table est ordonnée en termes de la destruction qu'ils peuvent causer, mais ce n'est pas tout à fait vrai).
Les signaux avec un astérisque (*) ne sont PAS recommandés. La chose importante à ce sujet est que vous ne saurez peut-être jamais ce pour quoi il est programmé. Surtout SIGUSR
! Cela peut démarrer l'apocalipse (c'est un signal gratuit pour un programmeur qui fait ce qu'il veut!). Mais, s'il n'est pas traité OU dans le cas peu probable où il est traité pour se terminer, le programme se terminera.
Dans le tableau, les signaux avec les options par défaut pour terminer et générer un vidage de mémoire sont laissés à la fin, juste avant SIGKILL
.
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
Ensuite , je suggère pour cette longue réponse presque stupide :
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGQUIT
, SIGABRT
,SIGKILL
Et enfin, le
Réponse longue et longue définitivement stupide :
N'essayez pas ca a la maison.
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, SIGQUIT
, SIGABRT
, SIGSEGV
, SIGILL
, SIGFPE
Et si rien ne fonctionnait, SIGKILL
.
SIGUSR2
devrait être essayé avant SIGUSR1
car nous sommes mieux si le programme ne gère pas le signal. Et il est beaucoup plus probable qu'il gère SIGUSR1
s'il ne gère qu'un seul d'entre eux.
BTW, the KILL : il n'est pas faux d'envoyer SIGKILL
à un processus, comme une autre réponse l'a indiqué. Eh bien, pensez à ce qui se passe lorsque vous envoyez une shutdown
commande? Il essaiera SIGTERM
et SIGKILL
seulement. Pourquoi pensez-vous que c'est le cas? Et pourquoi avez-vous besoin d'autres signaux, si la shutdown
commande même n'utilise que ces deux?
Maintenant, revenons à la longue réponse , c'est un joli oneliner:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
Il dort pendant 30 secondes entre les signaux. Sinon, pourquoi auriez-vous besoin d'un oneliner ? ;)
Aussi, recommandé: essayez-le avec uniquement les signaux 15 2 9
de la réponse raisonnable .
sécurité : retirez le second echo
lorsque vous êtes prêt à partir. Je l'appelle mon dry-run
pour les onliners . Utilisez-le toujours pour tester.
Script tuer avec grâce
En fait, j'étais tellement intrigué par cette question que j'ai décidé de créer un petit script pour faire exactement cela. N'hésitez pas à le télécharger (cloner) ici:
Lien GitHub vers le référentiel Killgracefully