Cosa fare quando Ctrl-C non uccide il lavoro in esecuzione?


98

A volte, i processi ignorano il segnale SIGINT inviato da Ctrl- Cin Bash. Ad esempio, mane vi. Supponendo che non si desideri google o leggere il manuale su come uscire dal processo in esecuzione, esiste una sequenza di tasti che funzionerà sempre (senza uscire dal terminale)?

Risposte:


141

Invia il segnale SIGQUIT con Ctrl+ \.

.. $ sleep 10
^\Quit

→ Questo equivale a kill -3 pid. I programmi eseguiti nello spazio utente non ignorano sigquit.

C'è anche una serie di scorciatoie da tastiera di Magic SysRq . Uno dei più interessanti è questo: Alt+ SysRq+ k. Uccide tutti i processi sulla console virtuale corrente. Se uno dei tuoi tty è completamente e completamente rotto, questo può essere usato per tornare indietro . Sul tty che esegue X.org, può essere usato per uccidere X senza pietà.

Il tasto SysRq è, sulla maggior parte delle tastiere, uguale al tasto Stampa. Sul mio taccuino, può essere invocato usando il tasto Fn; Vale a dire Alt → Fn → Stampa → k in questo ordine.

Ecco alcune delle scorciatoie per la gestione dei processi di base:

  • Ctrl+ Z: mette in pausa un processo (più bgper riprendere in background, fgper passare in primo piano)
  • Ctrl+ C: chiedi educatamente al processo di chiudere ora
  • Ctrl+ \: uccide senza pietà il processo che è attualmente in primo piano
  • Alt+ SysRq+ s: Scrivi i dati sul disco (fallo sempre prima di uccidere qualcosa di importante)
  • Alt+ SysRq+ s, k: Senza pietà uccidere tutti i processi in corso in una determinata console virtuale
  • Alt+ SysRq+ s, b: Senza pietà riavvia senza smontare,
  • Alt+ SysRq+ r, e, i, s, u, b: Sicura r eboot e ven i f del s istema è u tterly b roken,

Nota: Ctrl+ Z, a differenza di Ctrl+ Ce Ctrl+ \, funziona anche per man, vi, less, e simili.

In caso di dubbio, la seguente procedura funzionerà quasi sempre:

~$ sleep 10
^Z
[5]+  Stopped              sleep 10
~$ ps
  PID TTY          TIME CMD
 4804 pts/0    00:00:00 bash
 6207 pts/0    00:00:00 sleep
 6208 pts/0    00:00:00 ps
~$ kill -9 6207
[5]+  Killed                  sleep 10
~$ 

^ Z ovviamente indica che Ctrl+ Zè stato premuto.


Per uno sguardo più approfondito su conchiglie e terminali, vedere anche le mie risposte su:


3
Funziona con "sleep 10" ma non funziona per "man" o "vi". Ovviamente "kill -9 pid" funziona per uccidere entrambi i processi. Mi sto perdendo qualcosa?
Olivier Lalonde,

3
Ctrl + Z funziona con cose come less, man, vi e così via. Puoi quindi ucciderli facendo un psper vedere il loro id di processo e ucciderli usando kill pido, se non ti interessa altre istanze del programma killall vi,. In ogni caso, Ctrl-Z sembra sempre funzionare.
Stefano Palazzo

5
Puoi anche fare kill %%per terminare l'ultimo lavoro e kill %5dove 5 è il numero del lavoro mostrato in jobs.
Olivier Lalonde,

2
Ctrl- \ invia un SIGQUIT , non un SIGKILL. Ci sono alcune differenze importanti tra SIGQUIT e SIGKILL. en.wikipedia.org/wiki/SIGQUIT
Juliano

4
Come si preme Ctrl+ \ quando non è presente alcun \ tasto nel layout della tastiera?
Forivin,


8

A volte CTRL+Cviene inviato al programma o al canale di input errato. Ciò è particolarmente comune con editor come vi, ad esempio , con comandi con output convogliato, comandi bash complessi che coinvolgono loop, ecc.

Una soluzione semplice e veloce è quella di sospendere il lavoro CTRL+Ze poi ucciderlo per numero di lavoro: kill %1o kill -9 %1, ecc.


6
  • Prova uno di questi:

    Ctrl+4

    Ctrl+\


  • O:

    Ctrl+ Ze poi esegui:

    kill %1

Dov'è %1il numero di lavoro che è stato restituito quando è stato premuto Control- Z. Aggiungi -9per forzare l'uccisione.


Quando sei nella console di testo, puoi anche provare: Ctrl- SysRq. Il kernel dovrebbe terminare il processo.

Oppure SysRq- k, uccidi tutti i processi sulla console virtuale corrente (può anche uccidere i programmi X e svgalib).

Nota: quando si usano i tasti magici SysRq per uccidere un programma grafico congelato, il programma non ha alcuna possibilità di ripristinare la modalità testo. Questo può rendere tutto illeggibile.

Vedi: Tasto Magic SysRq e sue combinazioni di comandi.



0

È possibile che tu abbia modificato il collegamento di copia da:

CTRL+ SHIFT+C

Per

CTRL+C

In questo modo, quando si tenta di terminare un processo, il CTRL+ Cnon funziona.

Prova a sostituire il collegamento per la copia in CTRL+ SHIFT+ C.


1
La modifica del collegamento per la copia è irrilevante per forzare la chiusura di un processo!
SuB,

Puoi ampliare un po 'la tua risposta? Sarebbe l'ideale passo dopo passo, in primo luogo in modo che l'OP possa seguire il tuo suggerimento. :)
ThatGuy

Questo in realtà mi ha aiutato. Sono abituato a CTRL + C su MacOS, e non ho realizzato che il comando Ubuntu era CTRL + MAIUSC + C
ratskin

-1

Prova Ctrl+ Alt+Backspace

Se stai usando Ubuntu 10.04, vuoi abilitare questa chiave per funzionare.

Per abilitare Control- Alt-Backspace

Vai a Sistema -> Preferenze -> Tastiera

Seleziona la scheda Layout e fai clic su Opzioni layout .

Seleziona Sequenza di tasti per interrompere il server X e abilitare Control+ Alt+Backspace .

Nota:

Premendo Ctrl- Alt- Backspaceriavvierai il tuo server X.


Ho modificato la domanda per chiarire che voglio terminare il processo dall'interno del terminale.
Olivier Lalonde,
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.