Je viens de frapper Ctrlcdeux fois sur ma coquille pour tenter d'arrêter un processus qui prend beaucoup de temps à terminer.
^C
a été répété deux fois, mais le processus a continué.
Pourquoi n'a-t-il pas Ctrlcquitté le processus comme il le fait normalement?
shell
keyboard-shortcuts
le miroir
la source
la source
kill -9 %
de le tuer. Le signal 9 ne peut pas être ignoré, pas plus que le signal de suspension. La séquence de clavier CTRL + Z peut être ignorée en théorie - mais n'est pas en pratique.perl -E '$SIG{TSTP} = sub { say "ha ha" }; sleep 1 while 1'
. Vous pensez probablement au SIGSTOP, qui est un signal différent.Réponses:
Les processus peuvent choisir de:
trap '' INT
dans un shell) ou avoir son propre gestionnaire pour celui qui décide de ne pas se terminer (ou ne se termine pas en temps opportun).stty int '^K'
dans un shell)stty -isig
dans un shell).Ou, ils peuvent être ininterrompus, comme lorsqu'ils sont au milieu d'un appel système qui ne peut pas être interrompu.
Sous Linux (avec un noyau relativement récent), vous pouvez savoir si un processus ignore et / ou gère SIGINT en regardant la sortie de
SIGINT est 2. Le deuxième bit de SigIgn ci-dessus est 1, ce qui signifie que SIGINT est ignoré.
Vous pouvez automatiser cela avec:
Pour vérifier quel est le
intr
caractère actuel ou s'ilisig
est activé pour un terminal donné:(au-dessus du
intr
caractère est^C
(le caractère généralement envoyé par votre terminal (émulateur) lorsque vous appuyez sur CTRL-Cet les signaux d'entrée ne sont pas désactivés.(le
intr
caractère est^K
etisig
est désactivé pour/dev/pts/1
).Pour être complet, il existe deux autres façons dont un processus peut faire quelque chose pour arrêter de recevoir des SIGINT bien que ce ne soit pas quelque chose que vous voyez généralement.
Dès lors Ctrl+C, le signal SIGINT est envoyé à tous les processus du groupe de processus de premier plan du terminal . C'est généralement le shell qui place les processus dans des groupes de processus (mappés sur des jobs shell ) et indique au périphérique terminal qui est le premier plan .
Maintenant, un processus pourrait:
Quittez son groupe de processus. S'il se déplace vers un autre groupe de processus (n'importe quel groupe de processus mais celui qui est au premier plan ), il ne recevra plus le SIGINT Ctrl-C(ni les autres signaux liés au clavier comme SIGTSTP, SIGQUIT). Il pourrait cependant être suspendu s'il tentait de lire (éventuellement aussi en fonction des paramètres du terminal) à partir du terminal (comme le font les processus d'arrière-plan).
Par exemple:
ne pouvait pas être interruptible avec Ctrl-C. Ci
perl
- dessus va essayer de rejoindre le groupe de processus dont l'ID est le même que son ID de processus parent. En général, il n'y a aucune garantie qu'il existe un tel groupe de processus avec cet identifiant. Mais ici, dans le cas de cetteperl
commande exécutée seule à l'invite d'un shell interactif, le ppid sera le processus du shell et le shell aura généralement été démarré dans son propre groupe de processus.Si la commande n'est pas déjà un leader de groupe de processus (le leader de ce groupe de processus de premier plan), le démarrage d'un nouveau groupe de processus aurait le même effet.
Par exemple, selon le shell,
aurait le même effet.
ps
etperl
sont démarrés dans le groupe de processus de premier plan, mais sur la plupart des shells,ps
serait le leader de ce groupe (comme indiqué dans laps
sortie ci-dessus où le pgid des deuxps
etperl
est le pid deps
), doncperl
peut démarrer son propre groupe de processus.Ou cela pourrait changer le groupe de processus de premier plan. En gros, dites au périphérique tty d'envoyer le SIGINT à un autre groupe de processusCtrl+C
perl -MPOSIX -e 'tcsetpgrp (0, getppid) ou die $ !; dormir 5 '
Là,
perl
reste dans le même groupe de processus mais indique au terminal que le groupe de processus de premier plan est celui dont l'ID est le même que son ID de processus parent (voir la remarque ci-dessus à ce sujet).la source
hdparm
ousmartctl
sur un disque dur défectueux qui ne répond pas, ils se bloqueront pour toujours et vous ne pourrez pas les tuer avec CTRL + C. Vous pouvez savoir si un processus est en sommeil sans interruption en regardant la colonne stat deps aux
ou la colonne S detop
/htop
-D
signifie sommeil sans interruption. Ce n'est pas nécessairement une mauvaise chose, cela pourrait simplement signifier que le processus fait beaucoup d'E / S.