So che c'è ctrl+ c, ma a volte non funziona. Nel desktop di Ubuntu posso semplicemente chiudere la finestra del terminale e aprirne una nuova quando ciò accade, ma come si risolverebbe usando la CLI nel server Ubuntu (senza riavviare la scatola)?
So che c'è ctrl+ c, ma a volte non funziona. Nel desktop di Ubuntu posso semplicemente chiudere la finestra del terminale e aprirne una nuova quando ciò accade, ma come si risolverebbe usando la CLI nel server Ubuntu (senza riavviare la scatola)?
Risposte:
CTRL+Cinvierà SIGINT
all'applicazione. L'applicazione può configurare un gestore per questo segnale oppure ignorare il segnale. Per impostazione predefinita, non esiste un gestore e SIGINT
ucciderà 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, SIGKILL
che 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 SIGKILL
al processo, trova prima il processo con ps aux
o ps -edf
, quindi esegui kill -SIGKILL <process_ID>
, dove <process_ID>
è la PID
colonna ps
nell'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
, ps
e bash
. Per vedere una pagina man usa qualcosa come:man ps
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 kill
sull'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.
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.
Considero pgrep
ed pkill
essere più facile da usare rispetto kill
a 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 thing
e pkill thing
dovrebbe 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 pgrep
nuovo per vedere se ha avuto successo.
In caso contrario, eventualmente passare a pkill -9
.
Passeresti a un nuovo terminale, trovare il PID del processo bloccato (usando ps
), quindi usarlo kill
per 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.