Mam skrypt bash, który działa, dopóki maszyna Linux jest włączona. Zaczynam tak, jak pokazano poniżej:
( /mnt/apps/start.sh 2>&1 | tee /tmp/nginx/debug_log.log ) &
Po tym, jak się śmieje, widzę polecenie tee na moim wyjściu ps, jak pokazano poniżej:
$ ps | grep tee
418 root 0:02 tee /tmp/nginx/debug_log.log
3557 root 0:00 grep tee
Mam funkcję, która monitoruje rozmiar logu tworzonego przez tee i zabija polecenie tee, gdy log osiągnie określony rozmiar:
monitor_debug_log_size() {
## Monitor the file size of the debug log to make sure it does not get too big
while true; do
cecho r "CHECKING DEBUG LOG SIZE... "
debugLogSizeBytes=$(stat -c%s "/tmp/nginx/debug_log.log")
cecho r "DEBUG LOG SIZE: $debugLogSizeBytes"
if [ $((debugLogSizeBytes)) -gt 100000 ]; then
cecho r "DEBUG LOG HAS GROWN TO LARGE... "
sleep 3
#rm -rf /tmp/nginx/debug_log.log 1>/dev/null 2>/dev/null
kill -9 `pgrep -f tee`
fi
sleep 30
done
}
Ku mojemu zaskoczeniu, zabicie polecenia tee zabija również przez instancję start.sh. Dlaczego to? Jak mogę zakończyć polecenie tee, ale mój start.sh nadal działa? Dzięki.
tee -a
dotee
otwarcia pliku w trybie dopisywania, w przeciwnym razie będzie tee kontynuować zapis do pliku w tym samym przesunięcie po jej (obciąć i na systemach, które nie obsługują plików rzadkich jak na MacOS, które będą ponownie przypisz sekcję pliku prowadzącą do tej pozycji, zajmując dwa razy więcej miejsca na dysku).logger -s
przejście do syslog, aby zajął się rejestrowaniem (-s
aby wydrukować również na stderr).logrotate
. Świetny programWyjaśnienie „Dlaczego”
W skrócie: Jeśli zapisywanie nie powiedzie się, nie spowoduje zakończenia programu (domyślnie), będziemy mieli bałagan. Zastanów się
find . | head -n 10
- nie chceszfind
kontynuować pracy, skanując resztę dysku twardego, pohead
zajęciu 10 potrzebnych linii i kontynuowaniu.Zrób to lepiej: obróć wewnątrz rejestratora
Rozważ następujące, które w ogóle nie wykorzystują
tee
, jako przykładowy przykład:Jeśli działa jako:
... zacznie się od dołączenia do
/tmp/nginx/debug_log
, zmiany nazwy pliku na,/tmp/nginx/debug_log.old
gdy obecna jest ponad 100 KB treści. Ponieważ sam rejestrator wykonuje obrót, nie ma zepsutej rury, błędu ani okna utraty danych, gdy ma miejsce obrót - każda linia zostanie zapisana w jednym lub drugim pliku.Oczywiście implementacja tego w natywnym bashu jest nieefektywna, ale powyższy przykład jest przykładem. Dostępnych jest wiele programów, które zaimplementują dla Ciebie powyższą logikę. Rozważać:
svlogd
, rejestrator usług z pakietu Runit.s6-log
, aktywnie utrzymywana alternatywa z pakietu skanet.multilog
od DJB Daemontools, dziadka z tej rodziny narzędzi do nadzoru i monitorowania procesów.źródło