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


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

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

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


139


origen


screen sería una solución posible, lo que le permite crear una nueva ventana y kill el proceso desde allí. - Bobby
asumiendo que ya estabas en una pantalla :) - Dustin Boswell


Respuestas:


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

La mayoría de las conchas obligan Ctrl + do para "enviar un SIGINT señal al programa que actualmente se ejecuta en primer plano ". Puede leer sobre las diferentes señales a través de señal de hombre:

 SIGINT        2       Term    Interrupt from keyboard

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

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(Que es lo que hacen la mayoría de las conchas cuando presionas Ctrl + Z, por lo que no se garantiza que funcione).

Hay algunas señales que no pueden ser ignoradas por el proceso: SIGKILL, SIGSTOP y algunos otros Puede enviar estas señales a través del matar mando. Entonces, para matar a tu proceso de colgar / zombieying, solo encuentra el identificacion de proceso (PID). Por ejemplo, use pgrep o ps y entonces kill eso:

 % kill -9 PID

101



Un simple comentario. Tenga en cuenta que "zombie" es técnicamente un estado de proceso, y no es lo mismo que se entiende aquí por "zombieying". (Un proceso terminado que no ha sido wait () - ed por su padre está en zombie (Z) estado. En este caso, ya no puede manejar las señales). - Stéphane Gimenez
alas, a veces ctrl + c, ctrl + z, y ctrl + \ all no hacen nada, y el proceso está ejecutando deshacer sudo (permitido sin una contraseña) por lo que no se puede simplemente enviar una señal al proceso. - Michael


Si Ctrl+do (SIGINT) no funciona, prueba Ctrl+\ (SIGQUIT). Entonces intenta Ctrl+Z (SIGTSTP). Si eso lo devuelve a un intérprete de comandos de shell, haga kill en la identificación del proceso. (Esto es por defecto la señal SIGTERM, que puede especificar con kill -TERM. En algunos proyectiles, es posible que pueda usar %1 para referirse al PID.) Si eso no funciona, vaya a otro terminal o sesión de SSH y haga kill o kill -TERM en la identificación del proceso. Solo como último recurso deberías hacer kill -KILL, a.k.a. kill -9, ya que no da al proceso ninguna posibilidad de abortar limpiamente, sincronizar sus archivos abiertos, eliminar sus archivos temporales, cerrar las conexiones de red, etc.


90





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 usando nuevamente fg)

Entonces tú puedes kill o kill -9 dado su ID de proceso (lo obtiene de ps a)


25



Con bash puedes kill $!, como $! es una variable especial que contiene el pid del último programa de fondo. - Lloeki
@Lloeki no funciona para mí (al menos no es confiable). Tengo que bg una vez antes de que la variable tenga un valor asignado. - Daniel Beck♦
@ Daniel, correcto. Es como dije la última trasfondo proceso, por lo tanto necesita bg como justo después de Ctrl + Z, simplemente se suspende. - Lloeki
Nota: esto no es solo un truco, usar ps salida (o killall) es bastante arriesgado si tiene múltiples procesos con el mismo nombre ejecutándose. ps -e -o pid,command proporcionará pid + argumentos completos, no solo el nombre del programa, pero de nuevo podría no ser suficiente para discriminar. A diferencia de $! es un golpe seguro - Lloeki
@Lekeki No estoy de acuerdo. Ejemplo de línea de salida de ps a en mi sistema: 27721 s000 T 0:00.09 top Cuantos suspendidos (T, Creo) instancias del mismo comando (top) tienes corriendo en la misma tty (s000)? - Daniel Beck♦


Mira esto enlazar también.

Ctrl+Z: pausa un proceso.

Ctrl+do: cortésmente solicite que el proceso se cierre ahora.

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


21





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

Alternativamente, puede encontrar ID de proceso con

ps

Entonces puedes correr

kill -9 <Appropriate PID from ps output>

10





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 matar -9 el proceso por número de identificación.

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 la parte superior que le permite eliminar selectivamente los procesos en ejecución. La mayoría de las distribuciones tienen alto en un repositorio.

3) si solo está atrapado en una sesión ssh colgada (a otro sistema, por ejemplo), 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, que la mayoría de las personas hacen después de un período de inactividad.


4





¿Una solución más simple para Bash (y otras conchas?) Es hacer:

Ctrl-z      followed by     kill -9 %1

donde '% 1' se refiere al número de trabajo que se mata. Podría ser '% 2' (u otra cosa) si ya tiene otros trabajos para dormir. Puedes ver el número de trabajo cuando presionas Ctrl-z:

[1]+  Stopped                 <process name>

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


3





Si está utilizando tmux o pantalla, y ninguno de los anteriores funciona, igual podría matar el panel <prefix> x, entonces el proceso también es asesinado.


0





Puede haber una trampa con SIGINT (2) en su / etc / profile. Si es así, quítalo. Cierre sesión y vuelva a iniciar sesión y debería estar bien.


0