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

171

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

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 Ctrl+ Zmettre le processus en veille, puis effectuez l'opération kill -9 _process-pid_où vous trouvez le pid du processus avec ps et d'autres outils. Sur Bash (et éventuellement d'autres coquilles), vous pouvez faire kill -9 %1(ou '% N' en général) ce qui est plus facile. Si Ctrl+ Zne fonctionne pas, vous devrez ouvrir un autre terminal et tuer à partir de là.

Dustin Boswell
la source
screenserait une solution possible, vous permettant de créer une nouvelle fenêtre et killle processus à partir de là.
Bobby
2
en supposant que vous étiez déjà dans un écran :)
Dustin Boswell

Réponses:

119

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

La plupart des shells lient Ctrl+ Cpour "envoyer un signal SIGINT au programme actuellement exécuté au premier plan". Vous pouvez lire sur les différents signaux via le signal man :

 SIGINT        2       Term    Interrupt from keyboard

Les programmes peuvent ignorer ce signal, tout comme SIGTSTP :

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(C’est ce que font la plupart des coquillages lorsque vous appuyez sur Ctrl+ Z, ce qui explique pourquoi son fonctionnement n’est pas garanti.)

Certains processus ne peuvent être ignorés par le processus: SIGKILL , SIGSTOP et quelques autres. Vous pouvez envoyer ces signaux via la commande kill . Donc, pour mettre fin à votre processus de suspension / zombie, il suffit de trouver l’ ID de processus (PID). Par exemple, utilisez pgrepou pspuis ensuite kill:

 % kill -9 PID
Akira
la source
13
Une simple remarque. Attention, "zombie" est techniquement un état de processus, et ce n'est pas la même chose que ce que vous entendiez par "zombieying". (Un processus terminé qui n'a pas été attendu () par son parent est en état zombie ( Z). Dans ce cas, il ne peut plus gérer les signaux.)
Stéphane Gimenez le
hélas, parfois, les touches ctrl + c, ctrl + z et ctrl + \ ne font rien, et le processus est en cours d'exécution annulé sudo (autorisé sans mot de passe), vous ne pouvez donc pas simplement envoyer un signal au processus.
Michael
112

Si Ctrl+ C(SIGINT) ne fonctionne pas, essayez Ctrl+ \(SIGQUIT). Ensuite, essayez Ctrl+ Z(SIGTSTP). Si cela vous ramène à une invite du shell, utilisez killl'identifiant du processus. (Par défaut , ce signal SIGTERM, que vous pouvez spécifier avec kill -TERM. Dans certains coquillages, vous pouvez être en mesure d'utiliser %1pour désigner le PID). Si cela ne fonctionne pas, passez à un autre terminal ou une session SSH et à faire killou kill -TERMsur la ID de processus. En dernier recours , vous devriez le faire kill -KILL, kill -9c’est-à-dire qu’il ne donne au processus aucune chance d’abandonner proprement, de synchroniser ses fichiers ouverts, de supprimer ses fichiers temporaires, de fermer des connexions réseau, etc.

Nounours
la source
32

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!

(Restaurez au premier plan à nouveau en utilisant fg)

Ensuite, vous pouvez killou kill -9cela, compte tenu de son ID de processus (vous l’obtenez de ps a).

Daniel Beck
la source
13
Avec bash, vous pouvez kill $!, ainsi $!qu’une variable spéciale contenant le pid du dernier programme en arrière-plan.
Lloeki
@ Loeki ne fonctionne pas pour moi (du moins, pas fiable). Je dois le faire bgune fois avant que la variable obtienne une valeur.
Daniel Beck
2
@ Daniel, correct. Comme je l'ai dit, le dernier processus en arrière-plan a donc besoin d' bgêtre suspendu juste après Ctrl + Z.
Lloeki
2
Remarque: il ne s'agit pas simplement d'une astuce, utiliser la pssortie (ou killall) est assez risqué si vous exécutez plusieurs processus portant le même nom. ps -e -o pid,commandfournira pid + arguments complets, pas seulement le nom du programme, mais encore une fois pourrait ne pas être suffisant pour discriminer. En revanche $!est un coup sûr.
Lloeki
1
@ Loeki je ne suis pas d'accord. Exemple de ligne de sortie de ps amon système: 27721 s000 T 0:00.09 topcombien d' Tinstances suspendues ( , je pense) de la même commande ( top) avez-vous en cours d'exécution dans le même tty ( s000)?
Daniel Beck
30

Voir ce lien aussi.

Ctrl+ Z: mettre en pause un processus.

Ctrl+ C: demander poliment au processus de fermer maintenant.

Ctrl+ \: tuer sans pitié le processus qui est actuellement au premier plan

RoboAlex
la source
"ctrl"+ "\"n'a pas fonctionné pour moi
Benyamin Jafari
13

En règle générale, vous pouvez toujours arrêter le processus ( Ctrl+ Z), puis l'utiliser kill -9. En effet kill -9, vous avez d’abord besoin du PID du processus . Pour les tâches en arrière-plan, le kill -9 %1moyen le plus simple est de le faire - exécutez-vous si vous ne savez pas quel est le nombre de tâches en arrière-plan que vous souhaitez supprimer jobs.

Vous pouvez également rechercher un ID de processus avec

ps

Ensuite, vous pouvez courir

kill -9 <Appropriate PID from ps output>
Olli
la source
5

Une solution plus simple pour Bash (et autres coques?) Est de faire:

Ctrl-z      followed by     kill -9 %1

où '% 1' fait référence au numéro de travail en cours de suppression. Il peut s'agir de '% 2' (ou de quelque chose d'autre) si d'autres travaux sont déjà en attente. Vous pouvez voir le numéro de travail lorsque vous appuyez sur Ctrl-z:

[1]+  Stopped                 <process name>

Notez que "kill" est la version de shell du shell, pas / bin / kill.

Dustin Boswell
la source
4

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>puis tuer le processus par son numéro d’identification.

2) Si vous êtes connecté à distance, procédez de la même manière via une autre session de terminal.

Vous pouvez également simplifier un peu la vie en installant htop , une version plus polyvalente de top qui vous permet de supprimer de manière sélective les processus en cours. La plupart des distributions ont htop dans un repo.

3) si vous êtes juste bloqué dans une session SSH bloquée (sur un autre système, par exemple), essayez d’appuyer sur tilde (~), qui est la touche d'échappement, puis appuyez sur CTRL-Z pour revenir à la session hôte. peut tuer le processus ssh bloqué ou attendre son expiration, ce que la plupart des gens font après une période d’inactivité.

Linker3000
la source
0

Si vous utilisez tmux ou screen et si aucune des solutions ci-dessus ne fonctionne, vous pouvez toujours supprimer le volet <prefix> x, le processus est également supprimé.

ospider
la source
0

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 être bon.

TechNo_phile
la source