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.