tail -f error.log
Wie füge ich bei a einen Zeilenumbruch programmgesteuert ein, nachdem 3 Sekunden lang nichts an die Datei angehängt wurde?
(Sobald ein Zeilenumbruch hinzugefügt wurde, sollte kein weiterer Zeilenumbruch hinzugefügt werden, bis der Protokolldatei weitere Textzeilen hinzugefügt wurden.)
Diese Zeilen werden beispielsweise an error.log angehängt:
foo
bar
boo [[wait 4 seconds]]
2far
2foo
2bar
2boo [[wait 40 seconds]]
2far
Dies wäre die Ausgabe in der Konsole:
foo
bar
boo
2far
2foo
2bar
2boo
2far
shell-script
text-processing
tail
Cedric
quelle
quelle
ts
Zeitstempel zur Ausgabe hinzufügen und die Zeitstempel verarbeitenAntworten:
Sie können das immer von Hand implementieren
tail -f
(also hier, es sei denn, Sie kommentieren das ausseek()
, eher so,tail -n +1 -f
als würden wir die gesamte Datei sichern),perl
zum Beispiel mit:Oder lassen
tail -f
Sie das Tailing durchführen und verwenden Sieperl
, um die Zeilenumbrüche einzufügen, wenn 3 Sekunden lang keine Eingabe erfolgt:Diese gehen davon aus, dass die Ausgabe selbst nicht verlangsamt wird (wie wenn die Ausgabe an eine Pipe geht, die nicht aktiv gelesen wird).
quelle
bash
+date
Lösung:quelle
$SECONDS
Zeitintervalle zählen. Ich denke, es ist die Anzahl der Sekunden, die seit dem Start der Shell vergangen sind, nicht dass es wichtig ist, einen Unterschied zu machen.read -t
oder$TMOUT
.$SECONDS
ist eingebrochenbash
undmksh
.time bash -c 'while ((SECONDS < 3)); do :; done'
dauert zwischen 2 und 3 Sekunden. Verwenden Sie stattdessen lieber zsh oder ksh93 (mittypeset -F SECONDS
)date +%s
. Beide geben die Zeit in vollen Sekunden an, was zur Folge hat, dass das Intervall von beispielsweise 1,9 bis 4,0 wie 3 volle Sekunden aussieht, obwohl es wirklich 2,1 ist. Es ist schwierig, das zu umgehen, wenn Sie nicht auf die Sekundenbruchteile zugreifen können. Aber ja, sie sollten hier wahrscheinlich schlafen, anstatt sich zu beschäftigen, undread -t
könnten dann genauso gut benutzt werden. Auch wenn Sie manuell schlafen,time bash -c 'while [[ $SECONDS -lt 3 ]]; do sleep 1; done'
funktioniert gut.SECONDS=0
sichergestellt, dass$SECONDS
in genau 1 Sekunde 1 erreicht wird. Dies ist nicht der Fall,bash
da es verwendet wirdtime()
, um$SECONDS
stattdessen zu verfolgengettimeofday()
. Ich habe vor einiger Zeit Bugs bei mksh, zsh und bash gemeldet, nur zsh wurde behoben. (Guter Punkt über das Problem ist das gleiche mitdate +%s
). Beachten Sie, dass es sich hier nicht um eine Busyloop handelt, da wir von der Ausgabetail -f
über eine Pipe lesen .printf
emulieren ,date
ohne externe Werkzeuge oder Befehl Substitution:printf -v t '%(%s)T' -1
.Python
Lösung (mit dynamischem Zeitlückenargument ):tailing_by_time.py
Skript:Verwendung:
quelle