Question 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 juste "^ C" par 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 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 Frapper (et éventuellement d'autres coquilles), vous pouvez le 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 tuer De là.


139
2018-02-09 08:49


origine


screen serait une solution possible, vous permettant de créer une nouvelle fenêtre et kill le processus à partir de là. - Bobby
en supposant que vous étiez déjà dans un écran :) - Dustin Boswell


Réponses:


Comprendre le problème de savoir 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 SIGINT signal au programme qui fonctionne actuellement au premier plan ". Vous pouvez lire sur les différents signaux via signal de l'homme:

 SIGINT        2       Term    Interrupt from keyboard

Les programmes peuvent ignorer ce signal, car ils peuvent ignorer SIGTSTP ainsi que:

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(Quel est ce que la plupart des coquilles font quand vous appuyez sur Ctrl + Z, c'est pourquoi il n'est pas garanti pour fonctionner.)

Certains signaux ne peuvent pas être ignorés par le processus: SIGKILL, SIGSTOP et quelques autres. Vous pouvez envoyer ces signaux via le tuer commander. Donc, pour tuer votre processus de suspension / zombie, trouvez simplement le ID du processus (PID). Par exemple, utilisez pgrep ou ps et alors kill il:

 % kill -9 PID

101
2018-02-09 09:13



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


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'identifiant du processus. (Par défaut, le signal SIGTERM, que vous pouvez spécifier avec kill -TERM. Dans certaines coquilles, 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'identifiant du processus. Seulement en dernier recours devriez-vous faire kill -KILL, alias. kill -9, car cela ne donne aucune chance au processus d'abandonner proprement, de synchroniser ses fichiers ouverts, de supprimer ses fichiers temporaires, de fermer les connexions réseau, etc.


90
2018-02-09 09:36





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 il, étant donné son identifiant de processus (vous obtenez cela de ps a).


26
2018-02-09 08:53



Avec bash vous pouvez kill $!, comme $! est une variable spéciale contenant le pid du dernier programme en arrière-plan. - Lloeki
@Lloeki Ne fonctionne pas pour moi (du moins pas fiable). je dois bg une fois avant la variable obtient une valeur assignée. - Daniel Beck♦
@Daniel, correct. C'est comme je l'ai dit le dernier en arrière plan processus, a donc besoin bg comme juste après Ctrl + Z, il est simplement suspendu. - Lloeki
Note: ce n'est pas juste un truc, en utilisant ps sortie (ou killall) est assez risqué si vous avez plusieurs processus avec le même nom en cours d'exécution. ps -e -o pid,command fournira des arguments pid + full, pas seulement le nom du programme, mais encore une fois pourrait ne pas être suffisant pour discriminer. En revanche $! est un succès certain. - Lloeki
@Lloeki je ne suis pas d'accord. Exemple de ligne de sortie de ps a sur mon système: 27721 s000 T 0:00.09 top Combien de suspendu (T, Je pense) des instances de la même commande (top) avez-vous couru dans le même tty (s000)? - Daniel Beck♦


Regarde ça lien ainsi que.

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


21
2018-06-19 03:03





En général, vous pouvez toujours arrêter le processus (Ctrl + Z) et ensuite utiliser kill -9. Pour kill -9, vous avez besoin du processus PID premier. Pour les emplois en arrière-plan, kill -9 %1 est le moyen le plus simple de le faire - si vous ne savez pas quel est le nombre de tâches d'arrière-plan que vous voulez tuer, exécutez jobs.

Vous pouvez également trouver l'ID de processus avec

ps

Ensuite, vous pouvez courir

kill -9 <Appropriate PID from ps output>

10
2018-02-09 08:53





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

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

Vous pouvez également faciliter la vie en installant htop, qui est une version plus polyvalente de top qui vous permet de tuer de manière sélective les processus en cours d'exécution. La plupart des distributions ont un htop dans un repo.

3) si vous êtes simplement 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 utilisateurs continueront à faire après une période d'inactivité.


4
2018-02-09 09:01





Une solution plus simple pour Bash (et d’autres shells?) Est de faire:

Ctrl-z      followed by     kill -9 %1

où '% 1' fait référence au numéro de travail tué. Il peut s'agir de «% 2» (ou autre chose) si vous avez déjà d'autres tâches en attente. Vous pouvez voir quel numéro de travail il s'agit lorsque vous appuyez sur Ctrl-z:

[1]+  Stopped                 <process name>

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


3
2018-04-18 10:41





Si vous utilisez tmux ou screen, et que rien de tout cela ne fonctionne, vous pouvez toujours tuer le volet en <prefix> x, alors le processus est également tué.


0
2017-10-26 13:16





Il y a peut-être un piège avec SIGINT (2) dans votre / etc / profile. Si oui, retirez-le. Déconnectez-vous et reconnectez-vous et vous devriez être bon.


0