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

171

Ctrl+ Cno siempre funciona para eliminar el proceso actual (por ejemplo, si ese proceso está ocupado en ciertas operaciones de red). En ese caso, solo ve "^ C" con el cursor y no puede hacer mucho más.

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

Resumen de las respuestas: por lo general, puede Ctrl+ Zpara poner el proceso en suspensión, y luego hacer kill -9 _process-pid_, donde encuentra el pid del proceso con ps y otras herramientas. En Bash (y posiblemente otros shells), puede hacer kill -9 %1(o '% N' en general) lo que es más fácil. Si Ctrl+ Zno funciona, tendrás que abrir otra terminal y matar desde allí.

Dustin Boswell
fuente
screensería una posible solución, permitiéndole crear una nueva ventana y killel proceso desde allí.
Bobby
2
asumiendo que ya estabas en una pantalla :)
Dustin Boswell

Respuestas:

119

Para comprender el problema de por qué Ctrl+ Cno funciona, es muy útil comprender qué sucede cuando lo presiona:

La mayoría de los shells se unen Ctrl+ Cpara "enviar una señal SIGINT al programa que actualmente se ejecuta en primer plano". Puede leer sobre las diferentes señales a través de la señal man :

 SIGINT        2       Term    Interrupt from keyboard

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

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(Que es lo que hacen la mayoría de los shells cuando presiona Ctrl+ Z, por lo que no se garantiza que funcione).

Hay algunas señales que el proceso no puede ignorar: SIGKILL , SIGSTOP y algunas otras. Puede enviar estas señales a través del comando kill . Entonces, para matar su proceso de colgar / zombieying, solo busque la ID de proceso (PID). Por ejemplo, use pgrepo psy luego kill:

 % kill -9 PID
akira
fuente
13
Un simple comentario. Tenga en cuenta que "zombie" es técnicamente un estado de proceso, y no es lo mismo que quiso decir aquí con "zombieying". (Un proceso finalizado que no ha sido esperado () - editado por su padre está en estado zombie ( Z). En este caso, ya no puede manejar señales.)
Stéphane Gimenez
Por desgracia, a veces ctrl + c, ctrl + z y ctrl + \ no hacen nada, y el proceso se está ejecutando deshacer sudo (permitido sin una contraseña), por lo que no puede enviar una señal al proceso.
Michael
112

Si Ctrl+ C(SIGINT) no funciona, intente Ctrl+ \(SIGQUIT). Luego intente Ctrl+ Z(SIGTSTP). Si eso te devuelve a un indicador de shell, hazlo killen la ID del proceso. (Esto predeterminado es la señal SIGTERM, que puede especificar con kill -TERM. En algunos shells, puede usar %1para referirse al PID). Si eso no funciona, vaya a otro terminal o sesión SSH y haga killo kill -TERMen el identificacion de proceso. Solo como último recurso debe hacerlo kill -KILL, kill -9ya que no le da al proceso ninguna posibilidad de abortar limpiamente, sincronizar sus archivos abiertos, eliminar sus archivos temporales, cerrar conexiones de red, etc.

Osito de peluche
fuente
32

Presione 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!

(Restaurar a primer plano nuevamente usando fg)

A continuación, puede killo kill -9que, dada su ID de proceso (que conseguir eso de ps a).

Daniel Beck
fuente
13
Con bash puedes kill $!, como $!es una variable especial que contiene el pid del último programa en segundo plano.
Lloeki
@Lloeki no funciona para mí (al menos no es confiable). Tengo que hacerlo bguna vez antes de que la variable obtenga un valor asignado.
Daniel Beck
2
@Daniel, correcto. Es como dije el último proceso en segundo plano , por lo que necesita bgjusto después de Ctrl + Z simplemente se suspende.
Lloeki
2
Nota: esto no es solo un truco, usar la pssalida (o killall) es bastante arriesgado si tiene varios procesos en ejecución con el mismo nombre. ps -e -o pid,commandproporcionará pid + argumentos completos, no solo el nombre del programa, sino que nuevamente podría no ser suficiente para discriminar. En contraste $!es un éxito seguro.
Lloeki
1
@Lloeki, no estoy de acuerdo. Ejemplo de línea de salida de ps ami sistema: 27721 s000 T 0:00.09 top¿Cuántas Tinstancias suspendidas ( creo) del mismo comando ( top) tiene ejecutadas en el mismo tty ( s000)?
Daniel Beck
30

Vea este enlace también.

Ctrl+ Z: pausa un proceso.

Ctrl+ C: pide cortésmente que el proceso se cierre ahora.

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

RoboAlex
fuente
"ctrl"+ "\"no funcionó para mí
Benyamin Jafari
13

Por lo general, aún puede detener el proceso ( Ctrl+ Z) y luego usarlo kill -9. Para kill -9, primero necesita el PID de proceso . Para trabajos en segundo plano, kill -9 %1es la forma más fácil de hacerlo: si no está seguro de cuál es el número de trabajos en segundo plano que desea eliminar, ejecute jobs.

Alternativamente, puede encontrar la identificación del proceso con

ps

Entonces puedes correr

kill -9 <Appropriate PID from ps output>
Olli
fuente
5

Una solución más simple para Bash (¿y otros shells?) 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' (u otra cosa) si ya tiene otros trabajos en espera. Puede ver qué número de trabajo es cuando presiona Ctrl-z:

[1]+  Stopped                 <process name>

Tenga en cuenta que 'kill' es la versión del shell de kill, no / bin / kill.

Dustin Boswell
fuente
4

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

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

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

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

Linker3000
fuente
0

Si está utilizando tmux o screen, y ninguno de los anteriores funciona, aún puede eliminar el panel <prefix> x, entonces también se elimina el proceso.

ospider
fuente
0

Tal vez haya una trampa con SIGINT (2) en su / etc / profile. Si es así, retírelo. Salga y vuelva a iniciar sesión y debería ser bueno.

TechNo_phile
fuente