Wie kann man den `tail -f` Modus ohne die Tastenkombination` Strg + c` verlassen?

22

tail -f filenameWie kann ich den Modus beenden, ohne Ctrl+cden Vorgang abzubrechen?

Was ich möchte, ist ein normaler Weg zu beenden, wie qin top.

Ich bin nur neugierig auf die Frage, weil ich der Meinung bin, dass das Beenden des Prozesses keine gute Möglichkeit ist, etwas zu beenden.

Key Shang
quelle
23
tailist nicht interaktiv; Befehle werden nicht angenommen.
muru
5
Es gibt auch einen Unterschied zwischen dem Tötungsprozess mit SIGTERM (Standard) und SIGKILL. SIGTERM fordert den Prozess zum Anhalten auf, und dieses Signal kann vom Programm verarbeitet werden. Andererseits bricht SIGKILL den Prozess tatsächlich ab. Sehen Sie man signalmehr
mrc02_kr
9
Die Prämisse dieser Frage ist fehlerhaft. Das Sonderzeichen ist nicht „töten“ , um den Prozess in der Art und Weise , dass Sie denken sind. Es sendet das Interrupt-Signal , nicht die Kill- oder Terminate- Signale.
JdeBP
6
Es ist vollkommen vernünftig tail, es ohne Sorge zu unterbrechen oder sogar zu töten. Wenn Sie jedoch eine Alternative suchen, sollten Sie in Betracht ziehen most, die über einen zugegebenermaßen unterdokumentierten "Follow" -Modus verfügt, der mit Umschalt + F eingeleitet wurde und mit Q.
Toby Speight,
4
Das Problem hier ist Ihre Wahrnehmung, dass "das Beenden des Prozesses kein guter Weg ist, um etwas zu beenden" - ^ C an einen Prozess zu senden, ist eine Möglichkeit zu sagen, "Ich bin mit Ihnen fertig und ich möchte, dass Sie aufhören". Dies ist die "Standard" -Methode, um einen Terminalprozess unter Linux zu beenden. Wenn Sie sich dazu entschließen, einen lang andauernden Prozess zu beenden, können die Auswirkungen Ihrer Entscheidung, ihn zu beenden, ein Chaos hinterlassen, aber das tail -fist es nicht :)
Josh

Antworten:

46

Wie bereits in den Kommentaren erwähnt, Ctrl-Cwird der tailVorgang nicht abgebrochen , indem entweder ein SIGTERM- oder ein SIGKILL-Signal (das berüchtigte -9...) gesendet wird . Es wird lediglich ein SIGINT gesendet, der anweist tail, den Weiterleitungsmodus zu beenden und zu beenden.

Zu Ihrer Information, dies ist ein besseres Werkzeug:

less +F filename

In lesskönnen Sie drücken Ctrl-C, um den Vorwärtsmodus zu beenden und durch die Datei zu blättern. Drücken FSie dann, um erneut in den Vorwärtsmodus zu wechseln.

Beachten Sie, dass dies less +Fvon vielen als bessere Alternative zu empfohlen wirdtail -f . Lesen Sie die folgende Antwort, um Unterschiede und Einschränkungen zwischen den beiden Tools zu erfahren : Ist "tail -f" effizienter als "less + F"?

dr01
quelle
7
Off-Topic. Das OP forderte nicht auf, "den Vorwärtsmodus zu beenden und durch die Datei zu scrollen". Vielmehr fragte das OP, wie man tail -f ohne die
Tastenkombination
6
@ fpmurphy1 Angesichts der Tatsache, dass die Frage des OP falsch ist ( tailwird nicht durch STRG-C beendet und ist nicht interaktiv), halte ich meine Antwort für mehr als angemessen.
dr01
11
@ fpmurphy1 Wenn du das OP buchstäblich nimmst, ist es nicht thematisch, aber ich bevorzuge pädagogische Antworten, die Missverständnisse ansprechen und gleichzeitig eine Antwort auf das geben, was das OP tatsächlich versucht hat, dh die eigentliche Frage.
MarioDS
15
"Strg-C bricht den Tail-Prozess nicht ab" - Ja. Oder zumindest genauso viel kill <pid>. Bei den meisten Programmen gibt es keinen wirklichen Unterschied zwischen Ctrl-C(= SIGINT) SIGTERMund bis zu einem gewissen Grad SIGKILL. Die Standardaktion für alle drei ist, den Prozess einfach zu beenden, als ob exit()er aufgerufen worden wäre, mit der Ausnahme, dass für SIGKILLkeiner der Benutzermodus-Codes exit()aufgerufen wird (also keine atexit()Aufräumarbeiten usw.). Ctrl-Cund SIGTERMsind insbesondere völlig identisch, es sei denn, das Programm greift explizit auf eines von beiden zu und handelt danach. GNU-Tail nicht.
Marcelm
4
@marcelm Das Beenden des Prozesses ist nicht dasselbe wie exit()das Aufrufen . exit()wird die atexit()Handler ausführen und offene stdio-Dateien bereinigen (am wichtigsten Ausgabepuffer leeren). Ein SIGINTHandler könnte dies tun, aber die meisten Programme kümmern sich nicht darum. Ich weiß nicht ob tail.
Barmar
14

Was ich möchte, ist eine normale Art zu beenden, wie z. B. q oben.

Das ist ControlC:)

Ich bin nur neugierig auf die Frage, weil ich der Meinung bin, dass das Beenden des Prozesses keine gute Möglichkeit ist, etwas zu beenden.

^C( ControlC) sendet ein SIGINT an den Prozess, der wie folgt definiert ist:

Das SIGINT-Signal wird von seinem steuernden Terminal an einen Prozess gesendet, wenn ein Benutzer den Prozess unterbrechen möchte

Genau das wollen Sie hier tun, ist zu unterbrechen tail. Es gibt keine andere Möglichkeit, das zu erreichen, was Sie versuchen ("schön" Schluss zu machen), und während andere Antworten die Möglichkeit bieten, auf tailandere Weise aufzuhören , sind sie nicht besser.

Durch Drücken von ^Cwird versucht, eine Aufgabe unter Linux zu unterbrechen. Dies ist völlig normal und nur dann "nicht gut", wenn sich dieser Prozess in der Mitte von etwas befindet und Sie nicht zulassen, dass es beendet wird, und dann die einzige "nicht gute" Seite Effekt ist übrig gebliebene Dinge aus diesem Prozess. Beispiel: Während ^Ceines makeBefehls wird teilweise kompilierte Software verlassen, aber das ist in Ordnung: Ein weiterer Durchlauf von makewird diese bereinigen / fortsetzen, wo sie aufgehört hat.

Josh
quelle
2
Tatsächlich ist das makeBeispiel eine Erinnerung, warum wir immer .DELETE_ON_ERROR:in unsere Makefiles schreiben - wir möchten, dass Make teilweise geschriebene Zwischendateien entfernt, wenn es erfährt, dass einer seiner Befehle ein Signal empfangen hat.
Toby Speight
Prozesse können SIGINTvor dem Beenden abgefangen und bereinigt werden, wie in Tobys .DELETE_ON_ERROR:Beispiel angegeben.
Bis auf weiteres angehalten.
1
Ja, die Fähigkeit, SIGINT einzufangen, ist genau der Grund, warum ich gesagt habe, dass es das ist, was @Arthur will. Es gibt keine Notwendigkeit, "nett" zum Schwanz zu sein, Sie werden es Gefühle mit einem nicht verletzen ^C:)
Josh
12

tail -fDateiname, wie man den Modus verlässt, ohne Ctrl cden Prozess abzubrechen

Das kannst du nicht machen. Vielleicht wolltest du rennentail -f somefile | less

Das Ctrl cwird vom tty-Subsystem (und von Ihrer Shell) interpretiert und sendet ein SIGINTSignal (siehe signal (7) und pty (7) ...). Siehe tty entmystifiziert .

Basile Starynkevitch
quelle
6

Dies würde funktionieren und Ihre Frage beantworten, ist jedoch keine besonders zufriedenstellende Lösung.

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

Dadurch wird der Befehl 15 Sekunden lang ausgeführt und dann für Sie beendet, ohne dass Sie drücken müssen ^C

Criggie
quelle
5
Ja, so würde das Herunterfahren des Computers weiterlaufen tail. Trotzdem irren Sie sich nicht, denke ich.
Aaron
5
Wie ist es tailbesser , mit SIGTERM zu kündigen als mit SIGINT?
Dmitry Grigoryev
1
@DmitryGrigoryev Sie haben völlig Recht - es ist nicht besser. Diese Antwort beantwortet jedoch direkt die Frage des OP, auch wenn sie in der Realität nicht sehr nützlich ist. Allerdings habe ich Timeout verwendet, um Dinge wie Ping zu beenden, wenn Sie eine Dell DRAC Java-App verwenden, für die eine Menüauswahl erforderlich ist, um die Steuerung zu drücken, und eine zweite Menüauswahl, um die Steuerung freizugeben (was nur irritierend war, ein Dell c5220-Blade)
Criggie
0

Die Antworten unterscheiden sich je nach Kontext. Um tail -f elegant zu beenden , benötigen Sie einen Auslöser. Angenommen, Sie versuchen, die Ausgabe einer Aufgabe zu überwachen, die zu einem bestimmten Zeitpunkt abgeschlossen sein wird - dies kann Ihr Auslöser werden.

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

Ich habe in der Vergangenheit ähnliche Ideen verwendet.

Genießen.

navjit.brar
quelle