2011-02-09 08:49:24 +0000 2011-02-09 08:49:24 +0000
183
183

¿Qué hacer cuando Ctrl + C no puede matar un proceso?

Ctrl + C no siempre funciona para matar el proceso actual (por ejemplo, si ese proceso está ocupado en ciertas operaciones de la red). En ese caso, sólo ve “^C” por su cursor y no puede hacer mucho más.

¿Cuál es la forma más fácil de forzar a ese proceso a morir ahora sin perder mi terminal?

Resumen de las respuestas: Por lo general, puede Ctrl + Z para poner el proceso a dormir, y luego hacer kill -9 _process-pid_, donde encuentra el pid del proceso con ps y otras herramientas. En Bash (y posiblemente en otras conchas), puedes hacer kill -9 %1 (o ‘%N’ en general) lo cual es más fácil. Si Ctrl + Z no funciona, tendrás que abrir otra terminal y matar desde allí.

Respuestas (9)

127
127
127
2011-02-09 09:13:54 +0000

Para entender el problema de por qué Ctrl + C no funciona, es muy útil entender lo que sucede cuando lo presionas:

La mayoría de las conchas se unen a Ctrl + C para “enviar una señal SIGINT al programa que actualmente se ejecuta en el primer plano”. Puedes leer sobre las diferentes señales a través de man signal :

SIGINT 2 Term Interrupt from keyboard

Los programas pueden ignorar esa señal, como también pueden ignorar SIGTSTP :

SIGTSTP 18,20,24 Stop Stop typed at tty

(Que es lo que la mayoría de las shells hacen cuando presionas Ctrl + Z, por lo que no se garantiza su funcionamiento)

Hay algunas señales que no pueden ser ignoradas por el proceso: SIGKILL , SIGSTOP y algunas otras. Puedes enviar estas señales a través del comando kill . Así que, para matar tu proceso de colgado / zombi, sólo tienes que encontrar el ID del proceso (PID). Por ejemplo, usa pgrep o ps y luego kill it:

% kill -9 PID
119
119
119
2011-02-09 09:36:15 +0000

Si Ctrl+C (SIGINT) no funciona, pruebe Ctrl+\ (SIGQUIT). Entonces intente Ctrl+Z (SIGTSTP). Si eso te devuelve a un intérprete de comandos, haz kill en el ID del proceso. (Esto por defecto es la señal SIGTERM, que puedes especificar con kill -TERM. En algunos shells, puede usar %1 para referirse al PID). Si eso no funciona, ve a otra terminal o sesión SSH y haz kill o kill -TERM en el ID del proceso. Sólo como último recurso deberías hacer kill -KILL, también conocido como kill -9, ya que no le da al proceso ninguna oportunidad de abortar limpiamente, sincronizar sus archivos abiertos, eliminar sus archivos temporales, cerrar las conexiones de red, etc.

37
37
37
2012-06-19 03:03:03 +0000

Vea este link también.

Ctrl+Z: pausa un proceso.

Ctrl+C: pedir cortésmente al proceso que se apague ahora.

Ctrl+: matar sin piedad el proceso que está actualmente en primer plano

33
33
33
2011-02-09 08:53:17 +0000

Presiona Ctrl-Z para suspender el programa y ponerlo en segundo plano :

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(Restablecer en primer plano de nuevo usando fg)

Entonces, puedes kill o kill -9 él, dado su ID de proceso (lo obtienes de ps a).

13
13
13
2011-02-09 08:53:41 +0000

Por lo general, aún puedes detener el proceso (Ctrl + Z) y luego usar kill -9. Para kill -9, necesitas el PID del proceso primero. Para trabajos de fondo, kill -9 %1 es la forma más fácil de hacerlo - si no está seguro de cuál es el número de trabajo de fondo que quiere matar, ejecute jobs.

Alternativamente, puede encontrar el ID del proceso con

ps

Entonces puede ejecutar

kill -9 <Appropriate PID from ps output>
5
5
5
2011-02-09 22:40:53 +0000

Una solución más simple para Bash (y otros proyectiles?) es hacer:

Ctrl-z followed by kill -9 %1

donde ‘%1’ se refiere al número de trabajo que se está matando. Puede ser ‘%2’ (o algo más) si ya tienes otros trabajos durmiendo. Puedes ver qué número de trabajo es cuando pulsas Ctrl-z:

[1]+ Stopped <process name>

Nota que “kill” es la versión de la concha de matar, no /bin/kill.

4
4
4
2011-02-09 09:01:45 +0000

1) Si estás en la consola y en modo multiusuario, puedes presionar CTRL-ALT-Fn e iniciar sesión en otra pantalla, usar ps -ef | grep <myprocessname> o pidof <myprocessname> y luego matar -9 el proceso por el número de identificación.

2) Si estás conectado remotamente, haz lo mismo a través de otra sesión de terminal.

También podrías hacer la vida un poco más fácil instalando htop , que es una versión más versátil de top que te permite matar selectivamente los procesos en ejecución. La mayoría de las distros tienen htop en un repo.

3) si estás atascado en una sesión ssh colgada (a otro sistema, por ejemplo), intenta presionar tilde (~), que es la tecla de escape, y luego presiona CTRL-Z para volver a la sesión del host, entonces puedes matar el proceso ssh atascado o esperar a que se agote el tiempo de espera, lo que la mayoría de los silleros hacen después de un período de inactividad.

0
0
0
2017-04-18 10:41:06 +0000

Si estás usando un tmux o una pantalla, y nada de lo anterior funciona, aún podrías matar el panel para <prefix> x, entonces el proceso también se mata.

0
0
0
2017-10-26 13:16:30 +0000

Puede que haya una trampa con SIGINT(2) en tu /etc/profil. Si es así, quítala. Salga y vuelva a entrar y debería ser bueno.