2011-02-09 08:49:24 +0000 2011-02-09 08:49:24 +0000
183
183

Cosa fare quando Ctrl + C non riesce ad uccidere un processo?

Ctrl + C non sempre funziona per uccidere il processo corrente (per esempio, se quel processo è occupato in alcune operazioni di rete). In questo caso, basta vedere “^C” vicino al cursore e non si può fare molto altro.

Qual è il modo più semplice per forzare quel processo a morire ora senza perdere il mio terminale?

Riepilogo delle risposte: Di solito, si può Ctrl + Z per mettere il processo a dormire, e poi fare kill -9 _process-pid_, dove si trova il pid del processo con ps e altri strumenti. Su Bash (ed eventualmente altri gusci), si può fare kill -9 %1 (o ‘%N’ in generale) che è più facile. Se Ctrl + Z non funziona, dovrete aprire un altro terminale e kill da lì.

Risposte (9)

127
127
127
2011-02-09 09:13:54 +0000

Per capire il problema del perché Ctrl + C non funziona, è molto utile capire cosa succede quando lo si preme:

La maggior parte delle conchiglie legano Ctrl + C per “inviare un segnale SIGINT al programma che attualmente gira in primo piano”. Si può leggere dei diversi segnali tramite man signal :

SIGINT 2 Term Interrupt from keyboard
``` ```
SIGTSTP 18,20,24 Stop Stop typed at tty

I programmi possono ignorare quel segnale, come possono ignorare anche SIGTSTP :

% kill -9 PID
``` &001 


(che è quello che fa la maggior parte delle conchiglie quando si preme Ctrl + Z, per cui non è garantito che funzioni.) 


Ci sono alcuni segnali che non possono essere ignorati dal processo: [ SIGKILL ](http://en.wikipedia.org/wiki/Unix_signal#SIGKILL), [ SIGSTOP ](http://en.wikipedia.org/wiki/Unix_signal#SIGSTOP) e alcuni altri. È possibile inviare questi segnali tramite il comando [ kill ](http://man.cx/kill). Quindi, per uccidere il processo di impiccagione / zombieizzazione, basta trovare il [ Process ID ](http://en.wikipedia.org/wiki/Process_identifier) (PID). Per esempio, usare `pgrep` o `ps` e poi `kill` it: 

&001
119
119
119
2011-02-09 09:36:15 +0000

Se Ctrl+C (SIGINT) non funziona, prova Ctrl++ (SIGQUIT). Poi prova Ctrl+Z (SIGTSTP). Se questo ti riporta ad un prompt di shell, fai kill sull'ID del processo. (Questo valore predefinito è il segnale SIGTERM, che si può specificare con kill -TERM. In alcune shell, si può usare %1 per fare riferimento al PID). Se questo non funziona, andare su un altro terminale o sessione SSH e fare kill o kill -TERM sull'ID di processo. Solo come ultima risorsa dovresti fare kill -KILL, alias kill -9, in quanto non dà alcuna possibilità di interrompere il processo in modo pulito, sincronizzare i suoi file aperti, rimuovere i suoi file temporanei, chiudere le connessioni di rete, ecc.

37
37
37
2012-06-19 03:03:03 +0000

Vedere anche questo link .

Ctrl+Z: mettere in pausa un processo.

Ctrl+C: chiedere gentilmente al processo di chiudere ora.

Ctrl+Ctrl+: uccidere senza pietà il processo che è attualmente in primo piano

33
33
33
2011-02-09 08:53:17 +0000

Premere Ctrl-Z per sospendere il programma e metterlo in background :

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(Ripristinare in primo piano usando fg)

Poi, si può kill o kill -9, dato il suo ID di processo (lo si ottiene da ps a).

13
13
13
2011-02-09 08:53:41 +0000

Di solito, è ancora possibile interrompere il processo (Ctrl + Z) e poi utilizzare kill -9. Per kill -9, è necessario prima il processo PID . Per i lavori in background, kill -9 %1 è il modo più semplice per farlo - se non si è sicuri di quale sia il numero di lavori in background che si vuole uccidere, eseguire jobs.

In alternativa, si può trovare l'ID del processo con

ps

Poi si può eseguire

kill -9 <Appropriate PID from ps output>
5
5
5
2011-02-09 22:40:53 +0000

Una soluzione più semplice per Bash (e altri gusci?) è fare:

Ctrl-z followed by kill -9 %1
``` ```
[1]+ Stopped <process name>

dove ‘%1’ si riferisce al numero di lavoro che viene ucciso. Potrebbe essere ‘%2’ (o qualcos'altro) se avete già altri lavori che dormono. Si può vedere quale numero di lavoro è quando si preme Ctrl-z:

&001 &001

Si noti che ‘uccidere’ è la versione della conchiglia di uccidere, non /bin/kill.

4
4
4
2011-02-09 09:01:45 +0000

1) Se siete sulla console e in modalità multi-utente, potreste premere CTRL-ALT-Fn ed effettuare il login su un'altra schermata, usare ps -ef | grep <myprocessname> o pidof <myprocessname> e poi uccidere -9 il processo per numero ID.

2) Se siete collegati da remoto, fate lo stesso tramite un'altra sessione terminale.

Potreste anche rendere la vita un po’ più facile installando htop , che è una versione più versatile di top che vi permette di uccidere selettivamente i processi in esecuzione. La maggior parte delle distro hanno htop in un repo.

3) se siete solo bloccati in una sessione ssh appesa (ad un altro sistema, per esempio), provate a premere tilde (~), che è il tasto di escape, e poi premete CTRL-Z per tornare alla sessione host, poi potete uccidere il processo ssh bloccato o aspettare che si interrompa, cosa che la maggior parte sill fa dopo un periodo di inattività.

0
0
0
2017-04-18 10:41:06 +0000

Se si utilizza tmux o schermo, e nessuno di questi funziona, si potrebbe comunque uccidere il pannello entro <prefix> x, allora anche il processo viene ucciso.

0
0
0
2017-10-26 13:16:30 +0000

C'è forse una trappola impostata con SIGINT(2) nel vostro /etc/profile. Se è così, rimuovetela. Logout e riaccedi e dovresti essere bravo.