web-dev-qa-db-fra.com

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 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 + Z pour mettre le processus en veille, puis exécutez 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 créer 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 tuer à partir de là.

168
Dustin Boswell

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 coquilles se lient Ctrl + C "envoyer un signal SIGINT au programme qui s'exécute actuellement au premier plan". Vous pouvez lire sur les différents signaux via man signal :

 SIGINT        2       Term    Interrupt from keyboard

Les programmes peuvent ignorer ce signal, comme ils peuvent ignorer 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, c’est pourquoi il n’est pas garanti qu’il fonctionne.)

Certains processus ne peuvent pas ê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 le ID du processus (PID). Par exemple, utilisez pgrep ou ps, puis kill it:

 % kill -9 PID
115
akira

Si Ctrl+C (SIGINT) ne fonctionne pas, essayez Ctrl+\ (SIGQUIT). Alors essaye Ctrl+Z (SIGTSTP). Si cela vous ramène à une invite du shell, faites kill sur l'ID du processus. (Par défaut, le signal SIGTERM peut être spécifié avec kill -TERM. Dans certains shells, vous pourrez peut-être utiliser %1 pour faire référence au PID.) Si cela ne fonctionne pas, accédez à un autre terminal ou à une session SSH et faites kill. ou kill -TERM sur l'ID de processus. niquement en dernier recours si vous devez utiliser kill -KILL, a.k.a. kill -9, car cela ne donne aucune chance au processus d'abandonner proprement, de synchroniser ses fichiers ouverts, de supprimer ses fichiers temporaires, de se connecter au réseau, etc.

110
Teddy

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 kill ou kill -9, étant donné son ID de processus (vous obtenez cela à partir de ps a).

30
Daniel Beck

Voir ceci lien ainsi.

Ctrl+Z: mettre en pause un processus.

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

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

28
RoboAlex

Habituellement, vous pouvez toujours arrêter le processus (Ctrl + Z) et utilisez ensuite kill -9. Pour kill -9, vous avez d’abord besoin du PID du processus . kill -9 %1 est le moyen le plus simple de le faire. Si vous ne savez pas quel est le nombre de tâches en arrière-plan que vous souhaitez supprimer, exécutez jobs.

Vous pouvez également rechercher un ID de processus avec

ps

Ensuite, vous pouvez courir

kill -9 <Appropriate PID from ps output>
13
Olli

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 -9 le processus par 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 pourriez également vous simplifier la vie en installant htop , qui est 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 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é.

4
Linker3000

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» correspond à la version de kill du shell, et non à/bin/kill.

4
Dustin Boswell

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.

0
TechNo_phile

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

0
ospider