Come uccidere un gatto in fuga?


128

Molte volte eseguo accidentalmente il catcomando su file con contenuto fino a poche migliaia di righe.

Provo ad annullare il catcomando con Ctrl+ Co Ctrl+ Z, ma entrambi hanno effetto solo dopo che catnel terminale viene visualizzato l' output totale di , quindi devo aspettare fino a quando non catviene eseguito completamente.

Esiste una soluzione migliore che evita l'attesa? Perché a volte i file hanno dimensioni massime di 100 MB e diventa irritante aspettare.

Sto usando tcsh.


14
L'uso di comandi come more, less, tail, head può essere un'interessante alternativa a cat. (ovviamente questa non è una risposta ...)
tonioc

25
Questa è stata la più grande domanda che abbia mai letto. Fino a quando ho visto che il collegamento della domanda era per UL, ho pensato che avessi bisogno di aiuto per uccidere un felino in fuga.
Lenz,

5
Doppietta alla domanda della barra laterale da un altro sito SE È molto sollevato nel vedere il logo "UL" accanto alla domanda . Non importa, continua. (di solito, è Arquade che ha i titoli delle domande dall'aspetto molto sbagliato fuori dal contesto)
LindaJeanne

12
Vorrei provare il curiositycomando ...
Sekhemty,

4
alias curiosity='sudo killall cat'
Cas

Risposte:


76

Se i file in questione contengono davvero molti dati che inviano il segnale, possono effettivamente arrivare catprima che finisca. Quello che davvero osservi è la velocità finita del tuo terminale: catinvia i dati al terminale e ci vuole del tempo per visualizzarli tutti.

Ricorda che di solito deve ridisegnare in qualche modo l'intera finestra di output per ogni riga di output (ovvero spostare il contenuto della finestra di una riga in alto e stampare la riga successiva in fondo). Mentre ci sono tecniche e algoritmi per renderlo più veloce che se fosse fatto in modo semplice, ci vuole ancora del tempo.

Pertanto, se si desidera eliminare l'output il più rapidamente possibile, nascondere la finestra del terminale , poiché in genere non viene eseguito alcun ridisegno effettivo. In ambiente grafico ciò può significare minimizzare la finestra o passare a un desktop virtuale diverso, sulla console virtuale di Linux basta passare a un altro (( Ctrl+) Alt+ ).Fx

Si noti inoltre che se lo si eseguisse su un collegamento di rete lento (ad esempio SSH su una connessione GSM), si vedrebbe sicuramente molto meno output prima di catessere ucciso dal segnale, perché la velocità del terminale non sarebbe più il collo di bottiglia .


6
Se stai aspettando che i dati scendano da una pipe SSH lenta, puoi usare la sequenza di escape OpenSSH per chiudere la connessione. Su una nuova riga, digita ~?per vedere le opzioni disponibili ( ~.chiude).
RJHunter

11
Si tenta anche di interrompere l'output con Ctrl + S che invia tty-stop-output. È quindi possibile inviare Ctrl + C. Per riprendere l'output, premere Ctrl + Q ...
Martin Tournoij

1
@Carpetsmoker Lo ha provato, non ha interrotto il flusso di testo per me su Ubuntu 14.04 + terminator + zsh.
muru,

@muru Grazie. Ho provato a provarlo, ma non sono riuscito a riprodurre il problema (il mio sistema è troppo veloce, a quanto pare, o forse non ho provato abbastanza).
Martin Tournoij,

4
@Carpetsmoker Temo che il controllo del flusso del software (che è Ctrl + S) non sia di grande aiuto in questo caso (di un collegamento terminale rapido) - i dati sono già nel buffer del terminale e attendono che il terminale lo elabori. Quindi Ctrl + S dirà all'applicazione di interrompere l'invio di più dati, ma ciò che è già stato inviato dovrà comunque essere visualizzato.
Peter

4

Installazione del terminale

Suppongo che ciò abbia più a che fare con il modo in cui è installato il terminale, piuttosto che con qualsiasi problema di buffering. Controlla l'output di stty -a | grep intr, dovresti avere intr = ^C;sulla linea di output se Ctrl- Cè abilitato su tty/ pty. In caso contrario, è possibile utilizzare stty intr ^Cper abilitarlo. Aggiungi la linea alla tua .tcshrco .loginper renderla permanente (o elimina la linea che la modifica in primo luogo!).

Errore Ctrl- C, puoi anche provare a inviare SIGQUITcon Ctrl- \. Se non funziona, controlla di nuovo stty -a | grep quitper vedere se è impostato correttamente.

Impostazione dell'emulatore di terminale

Controlla anche le impostazioni del tuo emulatore di terminale (se ne stai usando uno), è possibile che ci sia una scorciatoia impostata a questo livello (forse per la copia o qualcosa del genere) e il Ctrl- Cnon raggiunge il ptylivello. Un collegamento potrebbe anche essere impostato altrove nell'ambiente desktop o nel sistema Windows.

Un buon test su Linux se si utilizza un emulatore di terminale è passare a una console Linux ( Ctrl- Alt- F1), accedere lì e vedere se si verifica lo stesso comportamento. In caso contrario, ciò suggerisce che il problema risiede nel sistema Windows o nell'emulatore di terminale.

Potrebbe essere un problema con il ritardo tra i dati letti dal ptydispositivo come suggerito da Peter . Ma se questo è il caso e tu in realtà dover aspettare minuti per i dati da visualizzare, allora sicuramente l'emulatore di terminale è il buffering modo troppi dati (o il vostro PC è molto lento). La risposta sarebbe trovare un modo per ridurre la dimensione del buffer nelle impostazioni dell'emulatore di terminale o usarne uno diverso.

Suggerimento extra

Qualcos'altro che vale la pena aggiungere; Di solito finisco nella catsituazione di fuga quando in caso accidentale catun file binario. L'altro effetto di questo può essere quello di rovinare le impostazioni del terminale (se i dati binari corrispondono a vari codici di escape del terminale che spesso fa). Se tputè installato (di solito è di default), puoi evitare di riavviare con il seguente comando:

tput reset

3

Questa è l' tmuxopzione c0-change-intervale c0-change-triggerprogettata per. Dovresti comunque utilizzare uno screen manager per la sessione riprendibile.


1

L' opzione Ctrl- Oè stata in Unix dai 110 baud giorni. I comandi Runaway cat sono sempre stati un problema quando veniva scaricato un file ASCII lungo nel dispositivo di output lento e l'intero file collocato nel buffer di output del driver del dispositivo. Ctrl- OAvvierebbe il flush del buffer e un follow-up Ctrl- ODisattiverebbe il flush in modo che il gatto potesse essere letto a velocità normale. Ctrl- è Ostato inserito e l'intero file si scarica e restituisce rapidamente un prompt dei comandi.

Non è noto se i programmatori di driver di dispositivo Linux sentano o meno la necessità di continuare ad aggiungere questa funzione. Questa funzione è stata aggiunta a livello di driver di dispositivo in cui Ctrl- Se Ctrl- Qpotevano essere implementati solo. L'ho usato per scaricare grandi esecuzioni di debug con molta stampa di controllo e quindi scorrere fino al punto che dovevo vedere.


Ctrl-O non sembra essere implementato nei moderni Linux, almeno non nel server RHEL o Ubuntu.
dotancohen,

-1

Quando usi bash, puoi sospendere il lavoro usando Ctrl+ Ze poi ucciderlo, usando il PID o seguendo le risposte da https://stackoverflow.com/questions/1624691/linux-kill-background-task (es. Kill -9 %%)


3
ma sto usando tcshe Ctrl + Z non funziona ... ho già affermato che in questione.
JigarGandhi,

sì, scusa, non hai letto nel tuo post che hai provato Ctrl + Z e ho erroneamente supposto che Ctrl + Z sia gestito dalla shell in contrasto con Ctrl + C che è gestito dall'applicazione. Ecco perché ho pensato che Ctrl + Z funzionasse all'istante mentre Ctrl + C no.
Jannis,

-1

aprire una nuova console, ad esempio facendo clic sull'icona della console o premendo Ctrl+ Alt+ F2. Ecco, entra

killall -9 cat

e il gatto verrà ucciso a meno che tu non abbia un blocco NFS stantio o una situazione di "sonno ininterrotto" (leggi su un settore danneggiato senza alcun timeout impostato).


10
Il problema non è con cat, riguarda ciò che catha scritto sul terminale prima di morire e non è stato ancora letto elaborato o visualizzato dall'emulatore di terminale (e si trova in un buffer (circa 64 kB di grandi dimensioni su Linux) all'interno del driver pty) .
Stéphane Chazelas,

Quindi prova echo 3> / proc / sys / vm / drop_caches che eliminerà anche molti buffer.
Thorsten Staerk,

7
No, ciò eliminerebbe solo i dati memorizzati nella cache, mai cose del genere, poiché ciò influirebbe sulla funzionalità!
Stéphane Chazelas,

4
@ThorstenStaerk drop_cachescontrolla le pagine utilizzate come cache dal kernel (di solito per un file system), non i buffer interni di terminali, i driver di rete e simili - se lo facesse, avrebbe conseguenze piuttosto gravi come sottolineato da Stéphane (fondamentalmente si perderebbero i dati) .
peterph

1
Non killall -9 catucciderebbe anche altre istanze di gatti che potrebbero ancora fare cose buone in altri thread di processo?
Joe

-7

Puoi provare con questo

Ripristina l' uso del display -ctrlj

Se cat è ancora in esecuzione, apri un nuovo terminale ed esegui questo pkill -9 -f cat"Questo ucciderà tutti i processi cat."


Ctrl + J non funziona
JigarGandhi

26
pkill con '-f cat' è abbastanza pericoloso, dal momento che -f cercherà il modello 'cat' in intere righe di comando, che probabilmente si verificherà e causerà risultati indesiderati ...
tonioc

2
Ad esempio, pkill -f catsul mio desktop ucciderebbe l'area della barra delle applicazioni della barra delle applicazioni di Xfce4.
Segna il
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.