Solo golpeé Ctrlcdos veces mi caparazón en un intento de detener un proceso que está tardando mucho en terminar.
^C
se repitió dos veces, pero el proceso simplemente continuó.
¿Por qué no Ctrlcabandonó el proceso como lo hace normalmente?
shell
keyboard-shortcuts
el espejo
fuente
fuente
kill -9 %
matarlos. La señal 9 no se puede ignorar, ni la señal de suspensión. La secuencia de teclado CTRL + Z puede ignorarse en teoría, pero no en la práctica.perl -E '$SIG{TSTP} = sub { say "ha ha" }; sleep 1 while 1'
. Probablemente estés pensando en SIGSTOP, que es una señal diferente.Respuestas:
Los procesos pueden elegir:
trap '' INT
un intérprete de comandos) o tiene su propio controlador que decida no terminar (o no puede terminar de manera oportuna).stty int '^K'
en un shell)stty -isig
un shell).O bien, pueden ser ininterrumpidos, como cuando se encuentra en medio de una llamada del sistema que no se puede interrumpir.
En Linux (con un kernel relativamente reciente), puede saber si un proceso está ignorando y / o manejando SIGINT mirando la salida de
SIGINT es 2. El segundo bit de SigIgn anterior es 1, lo que significa que SIGINT se ignora.
Puede automatizar eso con:
Para verificar cuál es el
intr
carácter actual o siisig
está habilitado para un terminal dado:(arriba del
intr
carácter está^C
(el carácter generalmente enviado por su terminal (emulador) al presionar CTRL-Cy las señales de entrada no están desactivadas.(el
intr
carácter está^K
yisig
está deshabilitado para/dev/pts/1
).Para completar, hay otras dos formas en que un proceso puede hacer algo para dejar de recibir SIGINT, aunque eso no es algo que normalmente vería.
Luego Ctrl+C, la señal SIGINT se envía a todos los procesos en el grupo de procesos en primer plano del terminal . Por lo general, es el shell el que coloca los procesos en grupos de procesos (asignados a trabajos de shell ) y le dice al dispositivo terminal cuál es el primer plano .
Ahora un proceso podría:
Deje su grupo de procesos. Si se mueve a otro grupo de procesos (cualquier grupo de procesos excepto el que está en primer plano ), ya no recibirá el SIGINT Ctrl-C(ni las otras señales relacionadas con el teclado como SIGTSTP, SIGQUIT). Sin embargo, podría suspenderse si intentara leer (posiblemente escribir también dependiendo de la configuración del dispositivo terminal) desde el dispositivo terminal (como lo hacen los procesos en segundo plano).
Como ejemplo:
no podría ser interrumpible con Ctrl-C. Lo anterior
perl
intentará unirse al grupo de procesos cuya ID es la misma que su ID de proceso principal. En general, no hay garantía de que haya un grupo de procesos con esa identificación. Pero aquí, en el caso de que eseperl
comando se ejecute solo en el indicador de un shell interactivo, el ppid será el proceso del shell y el shell normalmente se habrá iniciado en su propio grupo de procesos.Si el comando aún no es un líder de grupo de proceso (el líder de ese grupo de proceso en primer plano), entonces comenzar un nuevo grupo de proceso tendría el mismo efecto.
Por ejemplo, dependiendo del shell,
tendría el mismo efecto.
ps
yperl
se inician en el grupo de procesos en primer plano, pero en la mayoría de los shells,ps
sería el líder de ese grupo (como se ve en elps
resultado anterior donde el pgid de ambosps
yperl
el pid deps
), por lo queperl
puede comenzar su propio grupo de procesos.O podría cambiar el grupo de procesos en primer plano. Básicamente diga al dispositivo tty que envíe la SIGINT a algún otro grupo de procesosCtrl+C
perl -MPOSIX -e 'tcsetpgrp (0, getppid) o muere $ !; dormir 5 '
Allí,
perl
permanece en el mismo grupo de procesos, pero en cambio le dice al dispositivo terminal que el grupo de procesos en primer plano es aquel cuya ID es la misma que su ID de proceso principal (consulte la nota anterior sobre eso).fuente
hdparm
osmartctl
en un disco duro defectuoso que no responde, se bloqueará para siempre, y no puede matarlos con CTRL + C. Puede saber si un proceso está en suspensión ininterrumpida mirando la columna estadísticaps aux
o en la columna S detop
/htop
-D
significa suspensión ininterrumpida. Sin embargo, esto no es necesariamente algo malo, solo podría significar que el proceso está haciendo mucho IO.