Come uscire dalla modalità `tail -f` senza usare` Ctrl + c`?


22

Quando lo faccio tail -f filename, come uscire dalla modalità senza usare Ctrl+cper terminare il processo?

Quello che voglio è un modo normale per smettere, come qin top.

Sono solo curioso della domanda, perché sento che uccidere il processo non è un buon modo per uscire da qualcosa.


23
tailnon è interattivo; non accetta comandi.
muru,

5
C'è anche una differenza tra il processo di uccisione con SIGTERM (impostazione predefinita) e SIGKILL. SIGTERM "chiede" di interrompere il processo e questo segnale può essere gestito dal programma. D'altra parte SIGKILL effettivamente uccide il processo. Vedi man signaldi più
mrc02_kr

9
La premessa di questa domanda è errata. Quel personaggio speciale non "uccide" il processo nel modo in cui stai pensando. Invia il segnale di interruzione ad esso, non l'uccisione o terminare segnali.
JdeBP,

6
È perfettamente ragionevole interromperlo tailo addirittura ucciderlo senza preoccupazioni. Ma se vuoi un'alternativa, considera most, che ha una modalità "follow" dichiaratamente sotto documentata, avviata con Shift + F, e può essere chiaramente chiusa con Q.
Toby Speight,

4
Il problema qui è la tua percezione che "uccidere il processo non è un buon modo per uscire da qualcosa" - inviare ^ C a un processo è un modo per dire "Ho finito con te e vorrei che ti fermassi", esso è il modo "default" per uscire da un processo terminale in Linux. Se scegli di uscire da un lungo processo, le ripercussioni della tua scelta di fermarlo potrebbero lasciare un casino, ma tail -fnon è così :)
Josh,

Risposte:


46

Come detto nei commenti, Ctrl-Cnon uccide il tailprocesso, che viene eseguito inviando un segnale SIGTERM o SIGKILL (il famigerato -9...); invia semplicemente un SIGINT che dice taildi terminare la modalità avanti e uscire.

Cordiali saluti, questo è uno strumento migliore:

less +F filename

In less, è possibile premere Ctrl-Cper terminare la modalità di avanzamento e scorrere il file, quindi premere Fper tornare nuovamente alla modalità di avanzamento.

Nota che less +Fmolti sono sostenuti come una migliore alternativa atail -f . Per differenza e avvertenze tra i due strumenti, leggi questa risposta: `tail -f` è più efficiente di` less + F`?


7
Fuori tema. L'OP non ha chiesto di "terminare la modalità avanti e scorrere il file". Piuttosto, l'OP ha chiesto come uscire dalla coda -f senza usare Ctrl + C
fpmurphy il

6
@ fpmurphy1 Dato che la premessa della domanda del PO non è corretta ( tailnon viene eliminata da CTRL-C e non è interattiva), credo che la mia risposta sia più che appropriata.
dr01,

11
@ fpmurphy1 Se prendi l'OP alla lettera sì, è fuori tema, tuttavia preferisco le risposte educative che affrontano i malintesi e allo stesso tempo danno una risposta a ciò che l'OP stava effettivamente cercando di ottenere, cioè la vera domanda.
MarioDS,

15
"Ctrl-C non uccide il processo di coda" - Sì, lo fa. O almeno quanto kill <pid>fa. Per la maggior parte dei programmi, non c'è alcuna reale differenza tra Ctrl-C(= SIGINT), SIGTERMe, in una certa misura, SIGKILL. L'azione predefinita per tutti e tre è semplicemente terminare il processo, come se exit()fosse stato chiamato, con l'eccezione che per SIGKILL, nessuno dei codici di modalità utente associati exit()è chiamato (quindi nessuna atexit()pulizia ecc.). Ctrl-Ce SIGTERM, in particolare, sono completamente identici, a meno che il programma non lo catturi e non agisca esplicitamente. Coda GNU no.
marcelm,

4
@marcelm Terminare il processo non è lo stesso di exit()essere chiamato. exit()eseguirà i atexit()gestori e pulirà i file stdio aperti (soprattutto svuotando i buffer di output). Un SIGINTgestore potrebbe farlo, ma la maggior parte dei programmi non dà fastidio; Non so se tail.
Barmar,

14

Quello che voglio è un modo normale per uscire, come q in alto.

Questo è ControlC:)

Sono solo curioso della domanda, perché sento che uccidere il processo non è un buon modo per uscire da qualcosa.

^C( ControlC) invia un SIGINT al processo, che è definito come:

Il segnale SIGINT viene inviato a un processo dal suo terminale di controllo quando un utente desidera interrompere il processo

Questo è esattamente quello che vuoi fare qui, è interrompere tail. Non c'è altro modo per realizzare ciò che stai cercando di fare ("piacevolmente" smettere di coda) e mentre altre risposte forniscono un mezzo per fermarsi tailin altri modi, non sono migliori.

Premendo ^Csi tenterà di interrompere un'attività in Linux - questo è perfettamente normale, ed è "non buono" solo se quel processo è nel mezzo di qualcosa e non si sta lasciando che finisca, e quindi l'unico lato "non buono" l'effetto è ciò che resta di quel processo. Ad esempio, ^Cnel mezzo di un makecomando lascia un software parzialmente compilato, ma va bene: un'ulteriore esecuzione makepulirà / riprenderà da dove era stato interrotto.


2
In realtà, l' makeesempio è un promemoria per cui scriviamo sempre .DELETE_ON_ERROR:nei nostri Makefile: vogliamo che Make rimuova i file intermedi parzialmente scritti quando viene a sapere che uno dei suoi comandi ha ricevuto un segnale.
Toby Speight,

I processi possono intrappolare SIGINTed eseguire la pulizia prima dell'uscita come indicato nell'esempio di Toby .DELETE_ON_ERROR:.
In pausa fino a nuovo avviso.

1
Sì, la capacità di intrappolare SIGINT è esattamente il motivo per cui ho detto che è ciò che vuole @Arthur. Non c'è bisogno di essere "simpatici" da mettere in coda, non farai male ai suoi sentimenti con un ^C:)
Josh,

12

tail -fnome file, come uscire dalla modalità senza usare Ctrl cper terminare il processo

Non puoi farlo. Forse volevi correretail -f somefile | less

Il Ctrl cviene interpretato dal sottosistema TTY (e dalla vostra shell) e invia un SIGINTsegnale (vedi segnale (7) e PTY (7) ...). Vedi tty demysified .


6

Funzionerebbe e risponderebbe alla tua domanda, ma non è una soluzione particolarmente soddisfacente.

timeout 15s tail -f /var/log/messages

Questo eseguirà il comando per 15 secondi e poi lo ucciderà per te, senza dover premere ^C


5
Sì, quindi lo spegnimento del computer tailviene eseguito. Tuttavia, non sbagli, immagino.
Aaron,

5
In che modo terminare tailcon SIGTERM è meglio che terminarlo con SIGINT?
Dmitry Grigoryev il

1
@DmitryGrigoryev Hai perfettamente ragione, non è meglio. Ma questa risposta risponde direttamente alla domanda del PO, anche se in realtà non è molto utile. Tuttavia, ho usato il timeout per terminare cose come il ping, quando utilizzo un'app Dell DRAC Java che richiede una selezione di menu per premere Control e una seconda scelta di menu per rilasciare il controllo (che era solo irritante, un blade Dell c5220)
Criggie

0

Le risposte differiscono in base al contesto. Per uscire elegantemente dalla coda , avrai bisogno di un grilletto. Supponiamo che tu stia provando a monitorare l'output di un'attività che finirà ad un certo punto nel tempo - che può diventare il tuo trigger.

task >& filename.log &
task_pid=$!
tail -f filename.log &
tail_pid=$!
while [ 1 ]
do
    # -0 is a special "poke" signal - "are you around?"
    kill -0 $task_pid
    if [ $? -eq 0 ]
    then
        # Original task is still alive.
        sleep 2
        continue
    fi
    kill -TERM $tail_pid
    break
done

Ho usato idee simili in passato.

Godere.

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.