Ctrl + c ne tuera pas le processus


8

J'ai cherché des réponses et jusqu'à présent, je n'ai rien trouvé pour répondre à ma question. Je me connecte actuellement à mon serveur Ubuntu et lors de l'exécution d'un processus, je ne peux exécuter aucune des interruptions sur celui-ci. Voici mon stty -a:

user@Ubuntu1:~$ stty -a
speed 38400 baud; rows 93; columns 200; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;

Je n'ai rien dans mon .bashrc qui change les interruptions.

C'est la même chose pour tous les utilisateurs, y compris root. J'ai également essayé de me connecter à partir de différents emplacements en utilisant différents terminaux et à chaque fois que le même résultat apparaît. J'ai utilisé à la fois ssh et ssh -X pour me connecter.

Edit: Localement, toutes mes interruptions fonctionnent bien.

Mise à jour: je cherche toujours une réponse. Mon ami a exactement le même problème. Le problème semble être que lorsque vous vous connectez (depuis un PC, un Mac ou un Linux), le clavier ne récupère pas ces touches (même s'il est correctement mappé).


Quelle est la sortie de Ctrl+Vet frapper Ctrl+C? Avez-vous essayé de tuer le processus avec kill -s 2 <pid_of_process>? Cela doit être égal à l'envoi du signal SIGINT au processus. Vérifiez les paramètres de clé de votre émulateur de terminal.

La sortie est correcte. Si je fais le Ctrl + V suivant, puis Ctrl + CI obtenir ^ C. J'obtiens la même chose si je fais Ctrl + V puis Ctrl + Z je reçois ^ Z. Je peux tuer des processus avec kill si je le fais depuis un autre terminal. Notez également localement et dans d'autres terminaux que ces commandes fonctionnent
correctement

3
Avez-vous essayé de frapper Ctrl+Ctout en exécutant un autre processus (par exemple cat)? C'est peut-être ce processus qui ignore Ctrl+C. Ou voulez-vous dire que localement sur le serveur Ubuntu, ce processus particulier répond Ctrl+C, auquel cas, dans quel terminal avez-vous essayé? Et une screensession?
Gilles 'SO- arrête d'être méchant'

Si j'exécute quelque chose dans le terminal de ma machine, il ne détectera aucun problème. C'est dès que je ssh sur mon serveur qu'il ne captera pas les interruptions. Aucun des processus que j'ai essayés n'a
détecté

Si la commande est tuée avec kill -s 2(notez le -s 2, c'est SIGINT(le signal qui est généralement envoyé lorsque vous appuyez sur Ctrl + C, la valeur par défaut killest SIGTERM)), alors la commande n'ignore pas l'interruption. Quelque chose d'autre le ramasse. Lorsque vous l'exécutez localement et que cela fonctionne, dites-vous que cela fonctionne en utilisant le même terminal sur la machine cliente pour exécuter quelque chose en local, ou en exécutant un émulateur de terminal localement sur la machine serveur? Je me demande si vous utilisez un émulateur qui essaie d'imiter Ctrl + C du monde Windows ...
njsg

Réponses:


5

ctrl+ cne tue jamais un programme,

Ce n'est tout simplement pas ce qu'il fait.

Il existe un ensemble de signaux définis par la norme POSIX, qui sont utilisés pour contrôler un programme en cours d'exécution.

  First the signals described in the original POSIX.1-1990 standard.
  Signal     Value     Action   Comment
  ──────────────────────────────────────────────────────────────────────
  SIGHUP        1       Term    Hangup detected on controlling terminal
                                or death of controlling process
  SIGINT        2       Term    Interrupt from keyboard
  SIGQUIT       3       Core    Quit from keyboard
  SIGILL        4       Core    Illegal Instruction
  SIGABRT       6       Core    Abort signal from abort(3)
  SIGFPE        8       Core    Floating point exception
  SIGKILL       9       Term    Kill signal
  SIGSEGV      11       Core    Invalid memory reference
  SIGPIPE      13       Term    Broken pipe: write to pipe with no
  SIGTERM      15       Term    Termination signal

- http://man7.org/linux/man-pages/man7/signal.7.html

ctrl+ cenvoie le signal 2"Interruption du clavier" au programme que vous avez exécuté à partir d'un terminal.

C'est entièrement au programme de gérer ce signal, il peut faire ce qu'il veut à ce sujet. De nombreux interprètes de langage de script peuvent gérer cela de manière par défaut en tuant le script appelé et en quittant avec élégance.

Si vous voulez qu'un programme se termine, en particulier à partir d'un contexte automatique, le singal 15 est recommandé, le killprogramme peut être utilisé pour envoyer des signaux à un processus par id (pid).

kill -15 <pid>

Autant que je sache, le programme reçoit toujours ce signal lui-même et devrait terminer ASAP aussi proprement qu'il le peut.

Si le programme ignore le signal 15 cependant, et le programme persiste à vivre (et vous ne manquez pas d'envoyer le signal en raison d'une erreur d'autorisation)

kill -9 <pid>

Le signal 9, à ma connaissance, est interprété par le noyau (le gestionnaire de tâches et l'interface matérielle), le noyau arrête brusquement le traitement du programme et désalloue / libère toutes ses ressources.


3

Voici une astuce hardcore:

Control-Z

il suspendra votre processus et vous renverra l'ID de travail de ce processus

Alors:

kill -9 %1

(remplacez 1 par votre ID de travail).

Remarque: le pourcentage est obligatoire!, Sinon vous tuerez votre processus d'initialisation, ce qui signifie que vous tuerez le noyau et que tout le système plantera (alors ne mettez pas d'espace entre les deux :)


0

Ctrl + c ne tuera pas le processus. cela arrêtera simplement le processus en cours d'exécution au milieu. Pour tuer le processus, nous devons utiliser la commande "KILL"


7
En fait, killenvoie un signal à un processus. Ne le tue pas. Le signal par défaut envoyé avec killest TERM, le signal envoyé avec ctrl+cest SIGINT.
fmanco

0

Je suis tombé sur ce vieux post du forum sur ce problème particulier. Il semble que la séquence d'interruption par défaut puisse être remplacée dans un fichier de configuration séparé quelque part.

Si vous cherchez simplement à tuer ce processus en externe, vous pouvez utiliser kill, sachez que vous devez escalader le kill comme indiqué dans cet article sur les processus de kill , plutôt que de simplement passer au kill le plus extrême -9.

Wikipedia est une excellente ressource pour le programme kill . Voici également une liste des signaux Unix et ce qu'ils font.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.