¿Cómo abortar un comando atascado en el servidor ubuntu?

Respuestas:

21

CTRL+Cenviará SIGINTa 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 SIGINTmatará 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, SIGKILLlo 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 SIGKILLal proceso, primero encuentre el proceso con ps auxo ps -edf, luego kill -SIGKILL <process_ID>, ejecute , donde <process_ID>está la PIDcolumna en la pssalida.

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, psy bash. Para ver una página man use algo como:man ps

Mircea Vutcovici
fuente
2

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 killen 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.

madriguera
fuente
1

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.

Tim Brigham
fuente
1

Considero pgrep, y pkillpara ser más fácil de usar que killcon 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 thingy pkill thingdebe 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 pgrepnuevamente para ver si fue exitoso.

Si no, eventualmente muévase a pkill -9.

belacqua
fuente
0

Cambiaría a una nueva terminal, buscaría el PID del proceso atascado (usando ps) y luego lo usaría killpara 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.

Bill Weiss
fuente
0

Cntrl+ \funcionó para mí (donde Cntrl+ co zno funcionó)

vineeshvs
fuente