Finalizar un proceso en Unix en lugar de interrumpirlo

12

En la Unixlínea de comando si presiono Ctrl-C, eso no finaliza un proceso, sino que lo interrumpe y vuelvo al indicador de comandos de shell.

Entonces, tengo las siguientes dos preguntas:

    1. ¿Hay alguna manera de que pueda ver la lista de todos los procesos interrumpidos y finalizarlos?
    1. ¿Qué combinación de teclas presionar para finalizar un proceso en lugar de interrumpirlo?
Nicolás Alarcón Rapela
fuente

Respuestas:

20

Ctrl+ Cenvía a SIGINT. Por defecto, esto finaliza la aplicación.

Estás confundiendo esto con Ctrl-Z, que suspende una aplicación en bash.

Ignacio Vazquez-Abrams
fuente
7

Históricamente hubo tres señales vinculadas a las pulsaciones de teclas, estas fueron

  • SIGINT (Intettput) generalmente Ctrl+ CoDel
  • SIGQUIT - Salir - Generalmente vinculado a Ctrl+\
  • SIGSUSP Suspender: generalmente vinculado a Ctrl+Z

En algunos sabores * nix, también hay otras señales enlazadas, puede verificar los enlaces del teclado con el comando

stty -a

En mi sistema, OS / X, esto produce el siguiente resultado

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;

Tenga en cuenta que kill en este caso no es una señal de KILL que tiene que ver con borrar el búfer de entrada actual.

Es posible que tenga más éxito al detener los procesos con SIGQUIT, pero esto puede no ser cierto ya que el proceso puede captar la señal e ignorarla.

No existe el concepto de una lista de procesos "interrumpidos", ya que el proceso captó e ignoró la interrupción o salió. Puede obtener una lista de procesos suspendidos escribiendo trabajos

Steve Weet
fuente
Es interesante que muestre ^ Q y ^ S (como usted) pero lo configuré stty -ixonpara que se pasen. Creo que cambiarían a <undef>.
Pausado hasta nuevo aviso.
No encuentro un SIGSUSP en las páginas de manual de mi cuadro OS X o mi cuadro Debian Lenny. Parece ser SIGTSTP.
dmckee --- ex-gatito moderador
DEL - ah, Plan 9 ...
nuevo123456
5

Muchas respuestas correctas, pero ninguna que esté completa.

  1. Como muchos otros han dicho: Control-C generalmente envía la señal SIGINT de Unix y el comportamiento predeterminado (de los programas que no lo anulan) es "terminar el proceso". El programa puede ignorar esta señal o tomar una acción diferente si lo desea.
  2. También puede enviar SIGQUIT desde el teclado con Control- \. La diferencia aquí es que, de manera predeterminada, el proceso escribirá un archivo central y luego se cerrará. El programa puede ignorar esta señal o tomar una acción diferente si lo desea.
  3. Para finalizar con prejuicios extremos y sin permitir que el proceso lo detenga, use SIGKILL, que no está vinculado a ninguna tecla de forma predeterminada. En su lugar, generalmente lo envía utilizando el kill (1)comando y especificando la señal para enviar como en

    $ kill -9 <process ID>
    

    o mnemónicamente

    $ kill -KILL <process ID>
    

    El sistema operativo maneja esta señal directamente y el programa no puede anular el comportamiento predeterminado.

  4. Si su shell admite el control del trabajo, también puede admitir una versión incorporada killque admita la identificación del trabajo utilizando el %carácter como en la respuesta de la pasarela .

  5. Para pausar un proceso de forma reanudable, use Control-z que envía SIGTSTP. Reanude dicho proceso con el fgfin de continuar con el control del terminal o bgconfigurarlo para que se ejecute sin mantener el control del terminal (pero, de forma predeterminada, todavía envía su salida allí).
dmckee --- gatito ex moderador
fuente
Además, descargar el núcleo en SIGQUIT depende de muchos detalles administrativos. ulimit -c, coreadm (1M) en Solaris, etc. Otra nota: fg envía la señal SIGCONT, lo que hace que el proceso reanude su funcionamiento.
Tadeusz A. Kadłubowski
1
  1. para ver la lista de procesos en segundo plano: jobs

    matar: kill %1(sustituya 1 con la identificación de trabajo correspondiente como en la jobssalida)

  2. mira aquí
Comunidad
fuente
1

Ctrl-C envía SIGINT, que por defecto hace que un proceso finalice, pero puede quedar atrapado (en \bin sh, usando trap).

SIGKILL es la señal de muerte intransferible.

Editar Tercera vez, creo que esto es correcto: he comprobado todo con los documentos. Ya veremos.

Charles Stewart
fuente
SIGKILL no es atrapable.
Sí. Ya lo había arreglado ...
Charles Stewart
1

Esto no está claro para la mayoría de los novatos de la terminal, pero si su problema es solo que está en un programa interactivo y no puede encontrar la manera de salir, a menudo qsaldrá. Por ejemplo, esta es la clave para salir less, que también es el programa que obtienes cuando ves manpáginas, entre otras cosas.

Algunos programas tienen otros atajos de teclado para salir. En vimo vi, uso ESC:wq. En emacs, uso Control-C Control-X. En nanoo pico, uso Control-X. Tenga en cuenta que en estos ejemplos hay sutilezas, en particular, con respecto a si esos accesos directos guardan o no los cambios que haya realizado en el archivo que está editando.

asmeurer
fuente
Entonces, ¿cuál es el estándar?
Pacerier
0

Muchos procesos pueden instalar un controlador de interrupciones para capturar la señal de interrupción, pero los que no lo hacen abortarán de forma predeterminada.

Para forzar el cierre de un proceso, puede enviar SIGQUIT (Ctrl- \).

njd
fuente
SIGQUIT puede quedar atrapado, SIGKILL no puede estarlo.
Charles Stewart
1
@Charles: otra diferencia es que SIGQUIT vuelca el núcleo de forma predeterminada, SIGKILL no.
Tadeusz A. Kadłubowski
0

Parece que las otras respuestas son el escenario probable, pero también es posible que esté ejecutando un script que no maneja a sus hijos correctamente. Recientemente llegué a un escenario similar, donde matar un script no mataría los procesos secundarios de ese script.

En general, si se encuentra en esta situación, tendrá que revisar todos los procesos que está ejecutando. Deberías revisar la página de manual para ps. ( man ps) Me gusta especialmente usar ps auxwf, que muestra la relación padre / hijo entre los procesos. pstreehace algo similar Debe ejecutar esto desde otra terminal antes de finalizar el proceso para ver cómo se ven las cosas en la situación normal e identificar los procesos secundarios.

Si luego matas (con ^ C) ese proceso principal, verifica la salida de ps nuevamente para ver si algo ha cambiado. Si los procesos secundarios aún están disponibles, puede eliminarlos con el killcomando. (ver man kill)

ÁRBOL
fuente