Je sais qu'il y a ctrl+c, mais parfois ça ne marche pas. Dans Ubuntu Desktop, je peux simplement fermer la fenêtre du terminal et en ouvrir une nouvelle lorsque cela se produit, mais comment cela serait-il résolu à l'aide de la CLI sur le serveur Ubuntu (sans redémarrer la boîte)?
CTRL+C va envoyer SIGINT
à l'application. L'application peut configurer un gestionnaire pour ce signal ou l'ignorer. Par défaut, il n'y a pas de gestionnaire et SIGINT
va tuer l'application.
Vous pouvez utiliser CTRL+\ qui enverra SIGQUIT
. Cela générera également un vidage de mémoire si la limite de mémoire n'est pas nulle.
Vous pouvez suspendre le processus et retourner à Shell avec CTRL+Z, cela va arrêter l'exécution du processus et revenir à l'invite du shell. Le processus sera en mémoire et sera disponible en tant que travail dans le shell actuel. Vous pouvez ensuite utiliser kill -SIGNAL %%
ou kill -SIGNAL %<job_ID>
pour envoyer un signal à ce travail. Par exemple. pour tuer le dernier travail, utilisez kill -9 %%
Si aucun d’entre eux ne fonctionne, vous pouvez toujours envoyer SIGTERM
, puis, en dernier recours, SIGKILL
, qui mettra fin à tout processus. Ce signal, comme tout autre signal, doit être envoyé avec le même utilisateur que le processus que vous essayez d’arrêter ou en tant que root. Pour envoyer SIGKILL
au processus, commencez par rechercher le processus avec ps aux
ou ps -edf
, puis exécutez kill -SIGKILL <process_ID>
, où <process_ID>
est la colonne PID
dans la sortie ps
.
Les signaux ne peuvent pas être livrés si le processus est dans un appel sans interruption. Les appels en continu sont des fonctions du noyau qui ne peuvent pas être arrêtées et se produisent généralement à cause d'un mauvais pilote (par exemple, un pilote qui n'est pas réentrant ). Un processus en cours mise en veille ininterrompue ne peut pas être arrêté tant que l'appel n'est pas terminé ou que le serveur n'est pas redémarré.
Si un processus devient zombie , il n'utilisera aucune ressource prenant seulement de la place dans la table des processus. Un processus zombie ne peut pas recevoir de signaux.
La liste des signaux pour l'architecture actuelle peut être trouvée avec kill -l
Consultez les pages de manuel de kill
, ps
et bash
. Pour voir une page de manuel, utilisez quelque chose comme: man ps
Si vous avez un accès complet à la console, vous pouvez faire Alt-F1..12 et obtenez une nouvelle console.
À partir de là, vous pouvez faire une liste de processus comme suit:
ps aux | grep <process-name>
Ensuite, faites un kill
sur l'ID de processus:
kill -9 <pid>
Si vous ne disposez pas d'un accès complet à la console, ouvrez simplement une autre fenêtre de terminal (peut-être via PuTTY ou similaire) et effectuez la procédure ci-dessus pour répertorier et tuer les étapes.
Je considère que pgrep
et pkill
est plus facile à utiliser que kill
avec un ID de processus explicite.
De plus, au lieu de commencer par le signal 9 (SIGKILL), envisagez de commencer avec le SIGTERM par défaut (15). Cela donnera au processus une chance de se terminer normalement (s'il le peut). pkill -15 thing
et pkill thing
devraient être équivalents.
Voici comment cela fonctionnerait. Disons que ntpd est bloqué.
Quels sont les processus? (Vous pouvez passer à pkill si vous pensez ne pas avoir de faux positifs).
$ pgrep -fl ntp
1034 /usr/sbin/ntpd
1037 /usr/sbin/ntpd
Tuez les processus:
$ pkill ntpd
Utilisez à nouveau pgrep
pour voir s'il a réussi.
Sinon, passez éventuellement à pkill -9
.
Ctrl C envoie un SIGINT à votre processus en cours d'exécution. Si vous ne voulez pas ouvrir une autre console, vous pouvez envoyer un SIGQUIT avec Ctrl \. Cela s’adressera à la plupart des applications suspendues au jour le jour que le SIGINT n’a pas.
J'ai personnellement voulu un moyen d'envoyer un SIGKILL avec un raccourci mais je ne connais pas de moyen de le faire.
Cntrl + \ a travaillé pour moi (où Cntrl + c ou z n'a pas fonctionné)
Vous pouvez basculer vers un nouveau terminal, trouver le PID du processus bloqué (à l'aide de ps
), puis utiliser kill
pour tuer le processus. Je voudrais d’abord utiliser kill (PID)
. Si cela ne fonctionne pas, j'utiliserais kill -9 (PID)
. Si cela n'arrête pas le processus, la machine doit être redémarrée.