web-dev-qa-db-fra.com

Comment abandonner une commande bloquée sur le serveur Ubuntu?

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)?

11
CrazeD

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

22
Mircea Vutcovici

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.

2
warren

Je considère que pgrepet pkillest plus facile à utiliser que killavec 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 pgreppour voir s'il a réussi.

Sinon, passez éventuellement à pkill -9.

1
belacqua

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.

1
Tim Brigham

Cntrl + \ a travaillé pour moi (où Cntrl + c ou z n'a pas fonctionné)

0
dtypist

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.

0
Bill Weiss