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í.
screen
sería una posible solución, permitiéndole crear una nueva ventana ykill
el proceso desde allí.Respuestas:
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 :
Los programas pueden ignorar esa señal, ya que también pueden ignorar SIGTSTP :
(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
pgrep
ops
y luegokill
:fuente
Z
). En este caso, ya no puede manejar señales.)Si Ctrl+ C(SIGINT) no funciona, intente Ctrl+ \(SIGQUIT). Luego intente Ctrl+ Z(SIGTSTP). Si eso te devuelve a un indicador de shell, hazlo
kill
en la ID del proceso. (Esto predeterminado es la señal SIGTERM, que puede especificar conkill -TERM
. En algunos shells, puede usar%1
para referirse al PID). Si eso no funciona, vaya a otro terminal o sesión SSH y hagakill
okill -TERM
en el identificacion de proceso. Solo como último recurso debe hacerlokill -KILL
,kill -9
ya que no le da al proceso ninguna posibilidad de abortar limpiamente, sincronizar sus archivos abiertos, eliminar sus archivos temporales, cerrar conexiones de red, etc.fuente
Presione Ctrl-Z para suspender el programa y ponerlo en segundo plano :
(Restaurar a primer plano nuevamente usando
fg
)A continuación, puede
kill
okill -9
que, dada su ID de proceso (que conseguir eso deps a
).fuente
kill $!
, como$!
es una variable especial que contiene el pid del último programa en segundo plano.bg
una vez antes de que la variable obtenga un valor asignado.bg
justo después de Ctrl + Z simplemente se suspende.ps
salida (okillall
) es bastante arriesgado si tiene varios procesos en ejecución con el mismo nombre.ps -e -o pid,command
proporcionará 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.ps a
mi sistema:27721 s000 T 0:00.09 top
¿CuántasT
instancias suspendidas ( creo) del mismo comando (top
) tiene ejecutadas en el mismo tty (s000
)?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
fuente
"ctrl"
+"\"
no funcionó para míPor lo general, aún puede detener el proceso ( Ctrl+ Z) y luego usarlo
kill -9
. Parakill -9
, primero necesita el PID de proceso . Para trabajos en segundo plano,kill -9 %1
es 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, ejecutejobs
.Alternativamente, puede encontrar la identificación del proceso con
Entonces puedes correr
fuente
Una solución más simple para Bash (¿y otros shells?) Es hacer:
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:
Tenga en cuenta que 'kill' es la versión del shell de kill, no / bin / kill.
fuente
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>
opidof <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.
fuente
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.fuente
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.
fuente