Sé que hay ctrl+ c, pero a veces eso no funciona. En el escritorio de Ubuntu, puedo cerrar la ventana de terminal y abrir una nueva cuando esto sucede, pero ¿cómo se resolvería esto usando la CLI en el servidor de Ubuntu (sin reiniciar la caja)?
Sé que hay ctrl+ c, pero a veces eso no funciona. En el escritorio de Ubuntu, puedo cerrar la ventana de terminal y abrir una nueva cuando esto sucede, pero ¿cómo se resolvería esto usando la CLI en el servidor de Ubuntu (sin reiniciar la caja)?
Respuestas:
CTRL+Cenviará SIGINT
a la aplicación. La aplicación puede configurar un controlador para esta señal o puede ignorar la señal. Por defecto no hay controlador y SIGINT
matará la aplicación.
Puedes usar CTRL+\cuál enviará SIGQUIT
. Esto también generará un volcado del núcleo si el límite del núcleo no es cero.
Puede suspender el proceso y volver al shell con CTRL+Z, esto detendrá la ejecución del proceso y volverá al indicador del shell. El proceso estará en la memoria y estará disponible como un trabajo en el shell actual. Luego puede usar kill -SIGNAL %%
o kill -SIGNAL %<job_ID>
para enviar una señal a ese trabajo. Por ejemplo, para matar el último uso del trabajokill -9 %%
Si ninguno de ellos funciona, siempre puede enviarlo SIGTERM
, como último recurso, SIGKILL
lo que terminará cualquier proceso. Esta señal, como cualquier otra señal, debe enviarse como el mismo usuario que el proceso que está intentando detener o como root. Para enviar SIGKILL
al proceso, primero encuentre el proceso con ps aux
o ps -edf
, luego kill -SIGKILL <process_ID>
, ejecute , donde <process_ID>
está la PID
columna en la ps
salida.
Las señales no se pueden entregar si el proceso está en una llamada ininterrumpida. Las llamadas ininterrumpidas son funciones del kernel que no se pueden detener y generalmente ocurren debido a un controlador defectuoso (por ejemplo, un controlador que no es reentrante ). Un proceso que está en suspensión ininterrumpible no se puede detener hasta que se complete la llamada o se reinicie el servidor.
Si un proceso se convierte en zombie , no utilizará ningún recurso solo ocupando espacio en la tabla de procesos. Un proceso zombie no puede recibir señales.
La lista de señales para la arquitectura actual se puede encontrar con kill -l
Vea las páginas de manual de kill
, ps
y bash
. Para ver una página man use algo como:man ps
Si usted tiene acceso a la consola completa, puede hacerlo Alt- F1..12y obtener una nueva consola.
Desde allí, puede hacer una lista de procesos como la siguiente:
ps aux | grep <process-name>
Luego haga un kill
en la identificación del proceso:
kill -9 <pid>
Si no tiene acceso completo a la consola, simplemente abra otra ventana de terminal (tal vez a través de PuTTY o similar), y siga los pasos de listado y cierre del proceso anterior.
Ctrl C envía un SIGINT a su proceso en ejecución. Si no desea abrir otra consola, puede enviar un SIGQUIT con Ctrl \. Esto abordará la mayoría de las aplicaciones colgadas día a día que SIGINT no.
Personalmente, quería una forma de enviar un SIGKILL con un acceso directo, pero no estoy al tanto de cómo hacerlo.
Considero pgrep
, y pkill
para ser más fácil de usar que kill
con un ID de proceso explícito.
Además, en lugar de comenzar con la señal 9 (SIGKILL), considere comenzar con el SIGTERM predeterminado (15). Esto le dará al proceso la oportunidad de terminar con gracia (si puede).
pkill -15 thing
y pkill thing
debe ser equivalente.
Así es como funcionaría eso. Digamos que ntpd está colgado.
¿Cuáles son los procesos? (Puede saltar a pkill si cree que no tendrá falsos positivos).
$ pgrep -fl ntp
1034 /usr/sbin/ntpd
1037 /usr/sbin/ntpd
Mata los procesos:
$ pkill ntpd
Úselo pgrep
nuevamente para ver si fue exitoso.
Si no, eventualmente muévase a pkill -9
.
Cambiaría a una nueva terminal, buscaría el PID del proceso atascado (usando ps
) y luego lo usaría kill
para eliminar el proceso. Primero lo usaría kill (PID)
. Si eso no funciona, lo usaría kill -9 (PID)
. Si eso no detiene el proceso, la máquina debe reiniciarse.