Mettre fin à un processus sous Unix au lieu de l'interrompre

12

Sur la Unixligne de commande si j'appuie Ctrl-C, cela ne met pas fin à un processus, mais l'interrompt plutôt et je reviens à l'invite du shell.

J'ai donc les deux questions suivantes:

    1. Existe-t-il un moyen de voir la liste de tous les processus interrompus et de les terminer?
    1. Quelle combinaison de touches appuyer pour terminer un processus au lieu de l'interrompre?
Nicolás Alarcón Rapela
la source

Réponses:

20

Ctrl+ Cenvoie un SIGINT. Par défaut, cela met fin à l'application.

Vous confondez cela avec Ctrl-Z, ce qui suspend une application dans bash.

Ignacio Vazquez-Abrams
la source
7

Historiquement, il y avait trois signaux liés à des frappes, ce sont

  • SIGINT (Interruption) généralement Ctrl+ CouDel
  • SIGQUIT - Quitter - Habituellement lié à Ctrl+\
  • SIGSUSP Suspend - généralement lié à Ctrl+Z

Sur certaines versions de * nix, d'autres signaux sont également liés, vous pouvez vérifier les liaisons du clavier à l'aide de la commande

stty -a

Sur mon système, OS / X, cela produit la sortie suivante

speed 9600 baud; 65 rows; 213 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;

Veuillez noter que tuer dans ce cas n'est pas un signal KILL mais qu'il s'agit de vider le tampon d'entrée actuel.

Vous pouvez avoir plus de succès avec l'arrêt des processus utilisant SIGQUIT, mais cela peut ne pas être vrai car le processus peut capter le signal et l'ignorer.

Il n'y a pas de concept de liste de processus "interrompus" car le processus a soit intercepté et ignoré l'interruption, soit s'est terminé. Vous pouvez obtenir une liste des processus suspendus en tapant des travaux

Steve Weet
la source
Il est intéressant que je montre ^ Q et ^ S (comme vous), mais que je les ai configurés de stty -ixonmanière à ce qu'ils soient passés. Je pense qu'ils changeraient pour <undef>.
pause jusqu'à nouvel ordre.
Je ne trouve pas de SIGSUSP dans les pages de manuel de ma boîte OS X ou de ma boîte Debian Lenny. Il semble que ce soit SIGTSTP.
dmckee --- chaton ex-modérateur
DEL - ah, Plan 9 ...
nouveau123456
5

Beaucoup de bonnes réponses, mais aucune qui soit complète.

  1. Comme beaucoup d'autres l'ont dit: Control-C envoie généralement le signal Unix SIGINT et le comportement par défaut (des programmes qui ne le remplacent pas) est "terminer le processus". Le programme peut ignorer ce signal ou entreprendre une action différente s'il le souhaite.
  2. Vous pouvez également envoyer SIGQUIT à partir du clavier avec Control- \. La différence ici est que par défaut, le processus écrit un fichier core, puis quitte. Le programme peut ignorer ce signal ou entreprendre une action différente s'il le souhaite.
  3. Pour résilier avec un préjudice extrême et sans permettre au processus de vous arrêter, utilisez SIGKILL, qui n'est lié à aucune clé par défaut. Au lieu de cela, vous l'envoyez généralement à l'aide de la kill (1)commande et en spécifiant le signal à envoyer comme dans

    $ kill -9 <process ID>
    

    ou mnémoniquement

    $ kill -KILL <process ID>
    

    Ce signal est géré directement par le système d'exploitation et le programme ne peut pas remplacer le comportement par défaut.

  4. Si votre shell prend en charge le contrôle des tâches, il peut également prendre en charge une version intégrée killqui prend en charge l'identification des tâches en utilisant le %personnage comme dans la réponse de Catwalk .

  5. Pour suspendre un processus d'une manière pouvant reprendre, vous utilisez Control-z qui envoie SIGTSTP. Vous reprenez un tel processus fgen continuant à contrôler le terminal ou bgen le mettant en marche sans garder le contrôle du terminal (mais, par défaut, en y envoyant toujours sa sortie).
dmckee --- chaton ex-modérateur
la source
De plus, le dumping de core sur SIGQUIT dépend de nombreux détails administratifs. ulimit -c, coreadm (1M) sur Solaris etc. Une autre note - fg envoie un signal SIGCONT, ce qui fait que le processus reprend son fonctionnement.
Tadeusz A. Kadłubowski
1
  1. pour voir la liste des processus d'arrière-plan: jobs

    à tuer: kill %1(remplacez 1 par l'ID de travail correspondant comme dans la jobssortie)

  2. voir ici
Communauté
la source
1

Ctrl-C envoie SIGINT, qui par défaut provoque la fin d'un processus, mais peut être piégé (dans \bin sh, en utilisant trap).

SIGKILL est le signal de mise hors tension impossible.

Edit Troisième fois, je pense que c'est vrai: j'ai tout vérifié par rapport aux documents. Nous verrons.

Charles Stewart
la source
SIGKILL n'est pas piégeable.
Oui. J'avais déjà corrigé ça ...
Charles Stewart
1

Ce n'est pas clair pour la plupart des débutants de terminaux, mais si votre problème est simplement que vous êtes dans un programme interactif et que vous ne pouvez pas comprendre comment en sortir, cela se qterminera souvent . Par exemple, c'est la clé pour quitter less, qui est également le programme que vous obtenez lorsque vous affichez des manpages, entre autres.

Certains programmes ont d'autres raccourcis clavier pour quitter. Dans vimou vi, utilisez ESC:wq. Dans emacs, utilisez Control-C Control-X. Dans nanoou pico, utilisez Control-X. Notez que dans ces exemples, il existe des subtilités, en particulier, pour savoir si ces raccourcis enregistrent ou non les modifications que vous avez apportées au fichier que vous modifiez.

asmeurer
la source
Alors quelle est la norme?
Pacerier
0

De nombreux processus peuvent installer un gestionnaire d'interruptions pour intercepter le signal d'interruption, mais ceux qui ne sont pas abandonnés par défaut.

Pour forcer la fermeture d'un processus, vous pouvez envoyer SIGQUIT (Ctrl- \).

njd
la source
SIGQUIT peut être piégé, SIGKILL ne peut pas l'être.
Charles Stewart
1
@Charles: une autre différence est que SIGQUIT vide le cœur par défaut, SIGKILL non.
Tadeusz A. Kadłubowski
0

Il semble que les autres réponses soient le scénario probable, mais il est également possible que vous exécutiez un script qui ne gère pas correctement ses enfants. J'ai récemment rencontré un scénario similaire, où la suppression d'un script ne tuerait pas les processus enfants de ce script.

En général, si vous vous trouvez dans cette situation, vous devrez revoir tous les processus que vous exécutez. Vous devriez consulter la page de manuel de ps. ( man ps) J'aime particulièrement l'utilisation ps auxwf, qui montre la relation parent / enfant entre les processus. pstreefait quelque chose de similaire. Vous devez l'exécuter à partir d'un autre terminal avant de tuer le processus pour voir à quoi les choses ressemblent dans la situation normale et identifier les processus enfants.

Si vous tuez ensuite (avec ^ C) ce processus principal, vérifiez à nouveau la sortie de ps pour voir si quelque chose a changé. Si les processus enfants sont toujours là, vous pouvez les tuer avec la killcommande. (voir man kill)

ARBRE
la source