Ich leite derzeit die Ausgabe eines Überwachungstools in eine Datei um. Ich möchte diese Ausgabe jedoch auf meine Anfrage (mithilfe einer Tastenkombination) in eine neue Datei umleiten, ohne das Tool anzuhalten.
Etwas wie
monitor_program | handle_stdout
Wo handle_stdout
kann ich eine neue Datei definieren, in der das Protokoll an einem bestimmten Punkt abgelegt werden soll?
Ich weiß, dass ich es leicht schreiben könnte, aber ich frage mich, ob es ein Tool gibt, das dies bereits zulässt.
bash
pipe
io-redirection
stdout
Treviño
quelle
quelle
logrotate
manuell mit einer benutzerdefinierten Konfigurationsdatei ausgeführt werden, abhängig vom Verhalten Ihres monitor_program, aber das ist etwas hackisch.Antworten:
Ich werde eine Named Pipe vorschlagen.
Erstellen Sie eine Pipe
mkfifo p
(nennen Sie es wie Sie wollen, wenn nicht 'p')Erstellen Sie ein "Reader" -Skript, das aus der Pipe liest und schreibt, wo immer Sie möchten
Weisen Sie das Überwachungsprogramm an, seine Protokolle in die Named Pipe zu schreiben
Hier ist ein Beispielleser-Skript, das aus einer Named Pipe 'p' liest und die Daten in eine indizierte 'mylog'-Datei schreibt:
quelle
read
undprintf
statt nurcat <p >> mylog."$INDEX"
?Aufbauend auf Ihrer SIGINT-Idee können Sie hier mit SIGQUIT ( Ctrl+\) immer noch Ctrl+Cdas Ganze stoppen:
cat
Dies setzt voraus, dass es sich nicht um ein integriertes Element in Ihrer Shell handelt (es wird also durch Drücken von unterbrochen Ctrl+\).Beachten Sie, dass wie bei Ihrem Ansatz die Möglichkeit besteht, dass das SIGQUIT zum falschen Zeitpunkt (beim Aufruf des Schreibsystems) zugestellt wird und einige Daten verloren gehen.
quelle
Sie könnten wahrscheinlich
less
von dort aus verwenden und speichern, indem Sie sdann den Dateinamen eingeben, in dem Sie speichern möchten Enter. Von Wie schreibe ich alle Zeilen von weniger in eine Datei? .quelle
Ohne mehr über Ihre "Anfrage" zu wissen, ist es nicht wirklich möglich zu antworten. Wenn es auf der Dateigröße oder dem Intervall basieren würde, würden Rotatelogs (die mit Apache httpd gebündelt sein sollten) funktionieren.
quelle
Dank der Antwort von Jeff Schaller kam ich zu so etwas, das im Grunde das tut, was ich brauche. Nennen wir es
reader.sh
:Dann geht es nur noch darum, eine Named Pipe mit
mkfifo p
und mit zwei Terminals zu erstellen , auf denenmonitor_program > p
und ausgeführtreader.sh
werden. Ich kann dann den Leser anhalten, um mit Ctrl+ ein neues Protokoll zu erstellen C, und einen neuen Namen eingeben. Ctrl+ Z, wie immer dann, um anzuhalten und es zu töten.quelle