2011-02-09 08:49:24 +0000 2011-02-09 08:49:24 +0000
183
183

Que faire lorsque Ctrl + C ne peut pas tuer un processus ?

Ctrl + C ne fonctionne pas toujours pour tuer le processus en cours (par exemple, si ce processus est occupé dans certaines opérations du réseau). Dans ce cas, vous voyez juste “^C” à côté de votre curseur et vous ne pouvez pas faire autre chose.

Quel est le moyen le plus simple de forcer ce processus à mourir maintenant sans perdre mon terminal ?

Résumé des réponses: Habituellement, vous pouvez faire Ctrl + Z pour mettre le processus en sommeil, puis faire kill -9 _process-pid_, où vous trouvez le pid du processus avec ps et d'autres outils. Sur Bash (et éventuellement d'autres shells), vous pouvez faire kill -9 %1 (ou “%N” en général), ce qui est plus facile. Si Ctrl + Z ne fonctionne pas, vous devrez ouvrir un autre terminal et kill à partir de là.

Réponses (9)

127
127
127
2011-02-09 09:13:54 +0000

Pour comprendre le problème de pourquoi Ctrl + C ne fonctionne pas, il est très utile de comprendre ce qui se passe lorsque vous appuyez dessus :

La plupart des shells lient Ctrl + C pour “envoyer un signal SIGINT au programme qui tourne actuellement au premier plan”. Vous pouvez lire les différents signaux via man signal :

SIGINT 2 Term Interrupt from keyboard

Les programmes peuvent ignorer ce signal, tout comme ils peuvent ignorer SIGTSTP :

SIGTSTP 18,20,24 Stop Stop typed at tty

(ce que font la plupart des shells lorsque vous appuyez sur Ctrl + Z, c'est pourquoi son fonctionnement n'est pas garanti)

Certains signaux ne peuvent pas être ignorés par le processus : SIGKILL , SIGSTOP et quelques autres. Vous pouvez envoyer ces signaux via la commande kill . Ainsi, pour tuer votre processus de pendaison/zombie, il suffit de trouver l'ID de processus process ID (PID). Par exemple, utilisez pgrep ou ps et ensuite kill il :

% kill -9 PID
119
119
119
2011-02-09 09:36:15 +0000

Si Ctrl+C (SIGINT) ne fonctionne pas, essayez Ctrl+\ (SIGQUIT). Essayez ensuite Ctrl+Z (SIGTSTP). Si cela vous renvoie à une invite du shell, faites kill sur l'ID du processus. (Par défaut, il s'agit du signal SIGTERM, que vous pouvez spécifier avec kill -TERM. Dans certains shells, vous pouvez utiliser %1 pour faire référence au PID). Si cela ne fonctionne pas, allez sur un autre terminal ou une session SSH et faites kill ou kill -TERM sur l'ID du processus. En dernier recours seulement, faites kill -KILL, alias kill -9, car il ne donne aucune chance au processus d'avorter proprement, de synchroniser ses fichiers ouverts, de supprimer ses fichiers temporaires, de fermer les connexions réseau, etc.

37
37
37
2012-06-19 03:03:03 +0000

Voir aussi ce link .

Ctrl+Z : mettre en pause un processus.

Ctrl+C : demander poliment l'arrêt du processus maintenant.

Ctrl+\ : tuer impitoyablement le processus qui est actuellement au premier plan

33
33
33
2011-02-09 08:53:17 +0000

Appuyez sur Ctrl-Z pour suspendre le programme et le mettre en arrière-plan :

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(Restaurer au premier plan à nouveau en utilisant fg)

Ensuite, vous pouvez kill ou kill -9 lui, étant donné son ID de processus (vous obtenez cela de ps a).

13
13
13
2011-02-09 08:53:41 +0000

En général, vous pouvez toujours arrêter le processus (Ctrl + Z) et ensuite utiliser kill -9. Pour kill -9, vous devez d'abord utiliser le processus PID . Pour les jobs d'arrière-plan, kill -9 %1 est le moyen le plus simple de le faire - si vous n'êtes pas sûr du nombre de jobs d'arrière-plan que vous voulez tuer, exécutez jobs.

Alternativement, vous pouvez trouver l'ID du processus avec

ps

Puis vous pouvez exécuter

kill -9 <Appropriate PID from ps output>
5
5
5
2011-02-09 22:40:53 +0000

Une solution plus simple pour Bash (et autres obus ?) est de faire :

Ctrl-z followed by kill -9 %1

où “%1” fait référence au numéro de l'emploi tué. Il peut s'agir de “%2” (ou autre chose) si vous avez déjà d'autres emplois qui dorment. Vous pouvez voir de quel numéro d'emploi il s'agit lorsque vous appuyez sur Ctrl-z :

[1]+ Stopped <process name>

Notez que “kill” est la version shell de kill, et non pas /bin/kill.

4
4
4
2011-02-09 09:01:45 +0000

1) Si vous êtes sur la console et en mode multi-utilisateur, vous pouvez appuyer sur CTRL-ALT-Fn et vous connecter sur un autre écran, utiliser ps -ef | grep <myprocessname> ou pidof <myprocessname> et ensuite tuer -9 le processus par numéro d'identification.

2) Si vous êtes connecté à distance, faites de même via une autre session de terminal.

Vous pouvez également vous faciliter la vie en installant htop , qui est une version plus polyvalente de top qui vous permet de tuer sélectivement les processus en cours. La plupart des distros ont htop dans un repo.

3) si vous êtes juste bloqué dans une session ssh (vers un autre système, par exemple), essayez d'appuyer sur tilde (~), qui est la touche d'échappement, et ensuite appuyez sur CTRL-Z pour revenir à la session hôte, vous pouvez alors tuer le processus ssh bloqué ou attendre qu'il se déconnecte, ce que la plupart font après une période d'inactivité.

0
0
0
2017-04-18 10:41:06 +0000

Si vous utilisez un tmux ou un écran, et qu'aucun des éléments ci-dessus ne fonctionne, vous pouvez toujours tuer le volet par <prefix> x, alors le processus est également tué.

0
0
0
2017-10-26 13:16:30 +0000

Il y a peut-être un piège avec SIGINT(2) dans votre /etc/profile. Si c'est le cas, supprimez-le. Déconnectez-vous et reconnectez-vous et vous devriez vous en sortir.