Come interrompere un comando bloccato nel server Ubuntu?


Risposte:


21

CTRL+Cinvierà SIGINTall'applicazione. L'applicazione può configurare un gestore per questo segnale oppure ignorare il segnale. Per impostazione predefinita, non esiste un gestore e SIGINTucciderà l'applicazione.

Puoi usare CTRL+\quale invierà SIGQUIT. Ciò genererà anche un dump principale se il limite principale non è zero.

È possibile sospendere il processo e tornare alla shell con CTRL+Z, ciò interromperà l'esecuzione del processo e tornerà al prompt della shell. Il processo sarà in memoria e sarà disponibile come lavoro nella shell corrente. È quindi possibile utilizzare kill -SIGNAL %%o kill -SIGNAL %<job_ID>per inviare un segnale a quel lavoro. Ad esempio per uccidere l'ultimo lavoro utilizzatokill -9 %%

Se nessuno di loro funziona, puoi sempre inviarlo SIGTERM, quindi, come ultima risorsa, SIGKILLche terminerà qualsiasi processo. Questo segnale come qualsiasi altro segnale deve essere inviato come lo stesso utente del processo che si sta tentando di interrompere o come root. Per inviare SIGKILLal processo, trova prima il processo con ps auxo ps -edf, quindi esegui kill -SIGKILL <process_ID>, dove <process_ID>è la PIDcolonna psnell'output.

I segnali non possono essere inviati se il processo è in una chiamata ininterrotta. Le chiamate ininterrotte sono funzioni del kernel che non possono essere arrestate e di solito si verificano a causa di un driver non valido (ad esempio un driver che non è rientrante ). Un processo in modalità di sospensione ininterrotta non può essere arrestato fino al completamento della chiamata o al riavvio del server.

Se un processo diventa uno zombi , non utilizzerà alcuna risorsa occupando solo spazio nella tabella dei processi. Un processo di zombi non può ricevere segnali.

L'elenco dei segnali per l'architettura corrente è disponibile con kill -l

Vedi le pagine man di kill, pse bash. Per vedere una pagina man usa qualcosa come:man ps


2

Se si dispone di accesso alla console completa, si può fare Alt- F1..12e ottenere una nuova console.

Da lì, puoi fare un elenco dei processi come segue:

ps aux | grep <process-name>

Quindi eseguire un killsull'ID processo:

kill -9 <pid>

Se non si dispone dell'accesso completo alla console, è sufficiente aprire un'altra finestra del terminale (magari tramite PuTTY o simili), quindi eseguire l'elenco dei processi sopra e terminare i passaggi.


1

Ctrl C invia un SIGINT al processo in esecuzione. Se non si desidera aprire un'altra console, è possibile inviare un SIGQUIT con Ctrl \. Questo riguarderà la maggior parte delle app sospese quotidiane che SIGINT non ha.

Personalmente volevo un modo per inviare un SIGKILL con una scorciatoia, ma non sono a conoscenza di un modo per farlo.


1

Considero pgreped pkillessere più facile da usare rispetto killa un ID processo esplicito.

Inoltre, invece di iniziare con il segnale 9 (SIGKILL), considera di iniziare con il SIGTERM predefinito (15). Ciò darà al processo la possibilità di terminare con grazia (se possibile). pkill -15 thinge pkill thingdovrebbe essere equivalente.

Ecco come funzionerebbe. Diciamo che ntpd è appeso.

Quali sono i processi? (Puoi saltare a pkill se ritieni di non avere falsi positivi).

$ pgrep -fl ntp
1034 /usr/sbin/ntpd
1037 /usr/sbin/ntpd

Uccidi i processi:

$ pkill ntpd

Usa di pgrepnuovo per vedere se ha avuto successo.

In caso contrario, eventualmente passare a pkill -9.


0

Passeresti a un nuovo terminale, trovare il PID del processo bloccato (usando ps), quindi usarlo killper terminare il processo. Vorrei prima usare kill (PID). Se non funziona, lo userei kill -9 (PID). Se ciò non interrompe il processo, è necessario riavviare la macchina.


0

Cntrl+ ha \funzionato per me (dove Cntrl+ co znon ha funzionato)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.