Cosa fare quando Ctrl + C non può uccidere un processo?


171

Ctrl+ Cnon sempre funziona per interrompere il processo corrente (ad esempio, se quel processo è occupato in determinate operazioni di rete). In tal caso, vedi solo "^ C" con il cursore e non puoi fare molto altro.

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

Riepilogo delle risposte: di solito, è possibile Ctrl+ Zmettere in pausa il processo, quindi fare kill -9 _process-pid_, dove si trova il pid del processo con ps e altri strumenti. Su Bash (e possibilmente su altre shell), puoi fare kill -9 %1(o '% N' in generale) che è più facile. Se Ctrl+ Znon funziona, dovrai aprire un altro terminale e uccidere da lì.


screensarebbe una possibile soluzione, che consente di creare una nuova finestra e killil processo da lì.
Bobby,

2
supponendo che tu fossi già in uno schermo :)
Dustin Boswell,

Risposte:


119

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

La maggior parte delle shell si associano Ctrl+ Ca "invia un segnale SIGINT al programma che attualmente gira in primo piano". Puoi leggere i diversi segnali tramite il segnale man :

 SIGINT        2       Term    Interrupt from keyboard

I programmi possono ignorare quel segnale, in quanto possono ignorare anche SIGTSTP :

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(Questo è ciò che fa la maggior parte delle shell quando si preme Ctrl+ Z, motivo per cui non è garantito il funzionamento.)

Ci sono alcuni segnali che non possono essere ignorati dal processo: SIGKILL , SIGSTOP e alcuni altri. Puoi inviare questi segnali tramite il comando kill . Quindi, per terminare il processo di impiccagione / zombi, basta trovare l' ID di processo (PID). Ad esempio, utilizzare pgrepoe psquindi kill:

 % kill -9 PID

13
Una semplice osservazione. Attenzione che "zombi" è tecnicamente uno stato del processo, e non è lo stesso di quello che intendevi qui con "zombi". (Un processo terminato che non è stato wait () - edito dal suo genitore è nello stato zombie ( Z). In questo caso, non può più gestire i segnali.)
Stéphane Gimenez,

ahimè, a volte ctrl + c, ctrl + z e ctrl + \ non fanno nulla e il processo è in esecuzione annulla sudo (consentito senza password), quindi non è possibile inviare un segnale al processo.
Michael

112

Se Ctrl+ C(SIGINT) non funziona, prova Ctrl+ \(SIGQUIT). Quindi provare Ctrl+ Z(SIGTSTP). Se ciò restituisce un prompt della shell, eseguire killl'ID processo. (L'impostazione predefinita è il segnale SIGTERM, che è possibile specificare con kill -TERM. In alcune conchiglie, si può essere in grado di utilizzare %1per fare riferimento al PID). Se questo non funziona, andare in un altro sessione di terminale o SSH e fare killo kill -TERMsul ID processo. Solo come ultima risorsa dovresti fare kill -KILL, ovvero kill -9, poiché non dà al processo alcuna possibilità di interrompere in modo pulito, sincronizzare i suoi file aperti, rimuovere i suoi file temporanei, chiudere le connessioni di rete, ecc.


32

Premi 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!

(Ripristina nuovamente in primo piano utilizzando fg)

Quindi, è possibile killo kill -9che, dato il suo ID di processo (che si ottiene da ps a).


13
Con bash puoi kill $!, come $!è una variabile speciale contenente il pid dell'ultimo programma in background.
Lloeki,

@Lloeki Non funziona per me (almeno non affidabile). Devo farlo bguna volta prima che alla variabile venga assegnato un valore.
Daniel Beck

2
@ Daniele, giusto. È come ho detto l'ultimo processo in background , quindi bgcome appena dopo Ctrl + Z è semplicemente sospeso.
Lloeki,

2
Nota: questo non è solo un trucco, l'utilizzo psdell'output (o killall) è piuttosto rischioso se si hanno più processi con lo stesso nome in esecuzione. ps -e -o pid,commandfornirà pid + args completi, non solo il nome del programma, ma potrebbe non essere sufficiente per discriminare. Al contrario $!è un successo sicuro.
Lloeki,

1
@Lloeki Non sono d'accordo. Esempio di linea di output dal ps amio sistema: 27721 s000 T 0:00.09 topquante Tistanze sospese ( , credo) dello stesso comando ( top) hai in esecuzione nello stesso tty ( s000)?
Daniel Beck

30

Vedi anche questo link .

Ctrl+ Z: mette in pausa un processo.

Ctrl+ C: chiedi educatamente al processo di chiudere ora.

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


"ctrl"+ "\"non ha funzionato per me
Benyamin Jafari il

13

Di solito, è ancora possibile interrompere il processo ( Ctrl+ Z) e quindi 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 del numero di lavori in background che si desidera terminare, eseguire jobs.

In alternativa, è possibile trovare l'ID processo con

ps

Quindi puoi correre

kill -9 <Appropriate PID from ps output>

5

Una soluzione più semplice per Bash (e altre shell?) È fare:

Ctrl-z      followed by     kill -9 %1

dove '% 1' si riferisce al numero di lavoro che viene ucciso. Potrebbe essere '% 2' (o qualcos'altro) se hai già altri lavori a letto. Puoi vedere quale numero di lavoro è quando premi Ctrl-z:

[1]+  Stopped                 <process name>

Nota che 'kill' è la versione della shell di kill, non / bin / kill.


4

1) Se sei sulla console e in modalità multiutente, puoi premere CTRL-ALT-Fn e accedere su un'altra schermata, usare ps -ef | grep <myprocessname>o pidof <myprocessname>e quindi uccidere -9 il processo per numero ID.

2) Se si è connessi in remoto, fare lo stesso tramite un'altra sessione terminale.

Potresti anche semplificare la vita installando htop , che è una versione più versatile di top che ti consente di uccidere selettivamente i processi in esecuzione. La maggior parte delle distro ha htop in un repository.

3) se sei appena bloccato in una sessione ssh sospesa (ad un altro sistema, ad esempio), prova a premere tilde (~), che è il tasto Esc, quindi premi CTRL-Z per tornare alla sessione host, quindi può interrompere il processo SSH bloccato o attendere il timeout, cosa che la maggior parte fa dopo un periodo di inattività.


0

Se stai usando tmux o screen, e nessuna delle precedenti funzioni funziona, puoi comunque uccidere il riquadro <prefix> x, quindi anche il processo viene ucciso.


0

Forse c'è una trap impostata con SIGINT (2) nel tuo profilo / etc /. In tal caso, rimuoverlo. Esci e accedi nuovamente e dovresti essere bravo.

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.