Kiedy robisz a tail -f error.log
, jak wstawić programowo podział linii po tym, jak nic nie zostało dodane do pliku przez 3 sekundy?
(oczywiście po dodaniu jednego podziału wiersza nie należy dodawać żadnego innego podziału wiersza, dopóki inne wiersze tekstu nie zostaną dodane do pliku dziennika)
Na przykład te linie są dołączane do error.log:
foo
bar
boo [[wait 4 seconds]]
2far
2foo
2bar
2boo [[wait 40 seconds]]
2far
To byłoby wyjście w konsoli:
foo
bar
boo
2far
2foo
2bar
2boo
2far
shell-script
text-processing
tail
Cedric
źródło
źródło
ts
aby dodać znacznik czasu do wyjścia i przetworzyć znaczniki czasuOdpowiedzi:
Zawsze
tail -f
możesz ręcznie zaimplementować (cóż tutaj, chyba że cofniesz komentarzseek()
, bardziej jaktail -n +1 -f
zrzucamy cały plik) ręcznie,perl
na przykład:Lub
tail -f
wykonaj ogonowanie i użyj,perl
aby wstawić znaki nowej linii, jeśli nie ma danych wejściowych przez 3 sekundy:Zakładają, że samo wyjście nie jest spowalniane (jak wtedy, gdy wyjście trafia do potoku, który nie jest aktywnie odczytywany).
źródło
bash
+date
rozwiązanie:źródło
$SECONDS
do zliczania przedziałów czasowych. Myślę, że jest to liczba sekund od uruchomienia powłoki, a nie to, że ma to znaczenie przy przyjmowaniu różnicy.read -t
lub$TMOUT
.$SECONDS
jest włamanybash
imksh
.time bash -c 'while ((SECONDS < 3)); do :; done'
potrwa od 2 do 3 sekund. Lepiej używać zsh lub ksh93 zamiast tutaj (ztypeset -F SECONDS
)date +%s
. Oba dają czas w pełnych sekundach, co powoduje, że przedział od, powiedzmy, 1,9 do 4,0 wygląda jak 3 pełne sekundy, mimo że tak naprawdę to 2,1. Trudno to obejść, jeśli nie masz dostępu do ułamków sekund. Ale tak, prawdopodobnie powinni spać tutaj zamiast busyloopowania, a następnieread -t
równie dobrze mogliby zostać wykorzystani. Nawet jeśli śpisz ręcznie,time bash -c 'while [[ $SECONDS -lt 3 ]]; do sleep 1; done'
działa dobrze.SECONDS=0
zapewnia$SECONDS
osiągnięcie 1 w dokładnie 1 sekundę. Nie jest tak w przypadku,bash
gdy używatime()
do śledzenia$SECONDS
zamiastgettimeofday()
. Zgłaszałem błędy do mksh, zsh i bash jakiś czas temu, naprawiono tylko zsh. (dobra uwaga, że problem jest taki samdate +%s
). Zauważ, że to nie jest busyloop, ponieważ czytamy z wyjściatail -f
ponad potokiem.printf
naśladowaćdate
bez użycia narzędzi zewnętrznych lub podstawienia polecenia:printf -v t '%(%s)T' -1
.Python
rozwiązanie (z argumentem dynamicznej przerwy czasowej ):tailing_by_time.py
scenariusz:Stosowanie:
źródło