Quel est le but de l'option -9 dans la commande kill?

Réponses:

28

La page de manuel Ubuntu pour killexpliquer le but du -9commutateur (certes de façon plutôt saccadée):

Name     Num   Action    Description
KILL       9   exit      cannot be blocked

Voici ce qu'une autre page de manuel dit.

La commande killenvoie le signal spécifié au processus ou au groupe de processus spécifié. Si aucun signal n'est spécifié, le TERMsignal est envoyé. Le TERMsignal va tuer les processus qui n'attrapent pas ce signal. Pour d'autres processus, il peut être nécessaire d'utiliser le signal KILL( 9), car ce signal ne peut pas être capturé.


Par conséquent, l'utilisation du -9commutateur garantit que le processus est efficacement tué. Même si un processus figé ou ne répondant pas peut ne pas répondre à un simple TERM signal, il mourra dès l'envoi d'un KILLsignal.

SirCharlo
la source
40

La commande kill enverra un signal défini à un processus ayant une identité donnée (PID):

kill -<signal> <pid>

Bien sûr, nous ne pouvons tuer que les processus que nous possédons, alors que root peut tuer tous les processus. Voir Wikipedia pour un bon résumé des signaux informatiques.

Les signaux que vous killpouvez envoyer sont listés dans la page de manuel . Le signal peut être représenté par nom ou par numéro. Si aucun signal n'est donné, le signal par défaut 15 resp. TERMest utilisé.

Les trois commandes ci-dessous sont donc identiques:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

La différence entre SIGTERMet SIGKILLest la manière dont une application peut agir sur le signal:

  • TERM: une application pourra se terminer, c'est-à-dire exécuter correctement une routine d'arrêt.
  • KILL: les applications sont arrêtées et immédiatement supprimées (ce qui pourrait entraîner une perte de données ou une augmentation de la capacité à signaler un crash présumé dans certains cas).
Takkat
la source
16

Notez que tous les éléments suivants sont synonymes:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

Il convient de noter que dans le monde de la gestion des signaux, SIGKILL est l’un des rares systèmes uniques gérés par le système d’exploitation, et non par le programme. Lorsque vous exécutez kill -9, vous ne dites pas à l'application de se terminer, mais au système d'exploitation de cesser d'exécuter le programme, peu importe ce qu'il fait.

Après l' envoi de SIGKILL , le programme sera immédiatement arrêté. Si des appels du noyau sont en cours d'exécution (par exemple, File IO) au nom du programme, ces appels peuvent continuer ou non jusqu'à la fin, en fonction de l'appel, mais le programme lui-même ne s'exécutera plus. Notez que les tâches tracées ou exécutées sous un débogueur peuvent se comporter différemment ici.

L’autre signal qui ne peut pas être bloqué est SIGSTOP, qui a un effet similaire, mais gèle le programme; vous pouvez envoyer SIGCONT plus tard pour le reprendre. Ce comportement est entièrement contrôlé par le système d'exploitation et le programme ne reçoit aucune notification préalable.

Tous les autres signaux sont envoyés au programme. il peut les gérer comme il le souhaite ou s'il ignore le signal, un comportement par défaut est appliqué.

Voici quelques signaux utiles que vous pourriez vous retrouver en train d'envoyer à un processus:

  • SIGHUP - raccrocher
    Indique au programme que l'utilisateur a été déconnecté (par exemple, la session SSH ou la fenêtre du terminal a été fermée).
    Fait habituellement un arrêt gracieux du programme.
  • SIGINT - interruption
    Envoyé lorsque vous appuyez sur CTRL+ C
    signifie généralement "arrêtez ce que vous faites" - peut tuer ou ne pas tuer le programme
  • SIGTERM - terminate
    La valeur par défaut envoyée par killet killall.
    Termine généralement le programme ... parfois après que le programme a terminé quoi que ce soit qu'il fasse.
  • SIGSTOP - stop
    Envoyé lorsque vous appuyez sur CTRL+ Z
    Met le programme en pause, voir ci-dessus.
  • SIGPIPE - pipe closed
    Indique au programme que le pipeline a été fermé. Termine généralement le programme.
    Par exemple cat /etc/passwd | head -n1, SIGPIPE sera envoyé au catprocessus après l’impression de la première ligne, entraînant la catfin de celle-ci avant la fin de la totalité du fichier.

Bien que tous ces signaux arrivent "naturellement" dans leur propre réglage, vous pouvez utiliser le signal pour simuler une condition permettant d'obtenir le résultat souhaité.

Par exemple, si vous souhaitez mettre fin à la session SSH de quelqu'un, vous pouvez simplement arrêter le processus, mais ce faisant, vous l'empêcherez de mettre à jour son fichier HISTORY, ce qui peut être important pour des raisons de sécurité. Mais au lieu de cela, si vous envoyez SIGHUP , le processus supposera que la connexion est morte et effectuera son nettoyage standard.

tylerl
la source
Ctrl + \ envoie SIGQUIT, où l'action par défaut consiste à vider le noyau et à se terminer. Cela peut être utilisé si un programme fait quelque chose de très mal, vous devez l'arrêter immédiatement et vous souhaitez pouvoir le déboguer plus tard.
Simon Richter
@SimonRichter Oh, tu as raison. fixé.
tylerl
6

kill -9 Signification: Le processus sera tué par le noyau; ce signal ne peut être ignoré. 9 signifie que le signal KILL n'est ni captable ni ignorable

Utilisations: SIGKILL singal

Kill Signification: La commande kill sans signal passe le signal 15 qui termine le processus normalement.

Utilisations: signal SIGTERM , qui peut être manipulé par les programmeurs

devav2
la source