Używam skryptu init do uruchomienia prostego procesu, który zaczyna się od:
start-stop-daemon --start --quiet --chuid $DAEMONUSER \
--make-pidfile --pidfile $PIDFILE --background \
--exec $DAEMON $DAEMON_ARGS
Proces o nazwie $ DAEMON zwykle wypisuje informacje dziennika na swoje standardowe wyjście. O ile wiem, te dane nie są nigdzie przechowywane.
Chciałbym napisać lub dołączyć gdzieś standardowe wyjście $ DAEMON do pliku.
Jedynym rozwiązaniem, jakie znam, jest polecenie start-stop-daemonowi, aby bezpośrednio wywołał skrypt powłoki zamiast $ DAEMON; skrypt następnie wywołuje $ DAEMON i zapisuje do pliku dziennika. Ale to wymaga dodatkowego skryptu, który, podobnie jak modyfikacja samego demona, wydaje się niewłaściwym sposobem rozwiązania tak powszechnego zadania.
źródło
--start
go--stop
faktycznie działa.start-stop-daemon --test (...)
?>>
zamiast>
dołączania.Musisz zrobić:
Również jeśli używasz
--chuid
lub--user
, upewnij się, że użytkownik może pisać do/var/log
lub istniejącego/var/log/some.log
. Najlepszym sposobem jest pozostawienie tego użytkownika jako właściciela/var/log/subdir/
.źródło
bashPID=$(cat $PIDFILE); [ -n "$bashPID" ] && pkill -P "$bashPID"
pkill
rozwiązanie. Zastanawiasz się, co by się stało... -c "exec $DAEMON..."
(dodanie "exec"). Nie miej tego teraz na talerzu, więc nie mogę tego spróbować.Wygląda na to, że powinieneś być w stanie użyć tego
--no-close
parametru teraz , gdy zaczynaszstart-stop-daemon
przechwytywać wyjście demona. Ta nowa funkcja jest dostępna wdpkg
pakiecie od wersji 1.16.5 na Debianie:źródło
start-stop-daemon
. Jednak wersja openrc ma opcje-1
i-2
do przekierowania odpowiednio stdout i stderr.Z openrc (który jest domyślny na przykład w gentoo lub alpine linux)
start-stop-daemon
ma opcje-1
i-2
:Możesz więc po prostu napisać:
źródło
Przechwycenie wyjścia demona i zapisanie go do pliku nie jest zbyt trudne:
Jednak to rozwiązanie może być nieoptymalne dla
logrotate
.Lepiej byłoby przechwycić dane wyjściowe do syslog. W Debianie pasowałoby to do zachowania usług systemowych. Poniższa prosta próba przepisania powyższego przykładu jest błędna, ponieważ po zatrzymaniu demona pozostawia dwa procesy bez rodzica („zombie”) (rejestrator i demon), ponieważ
start-stop-daemon
kończy tylko jego dziecko, ale nie wszystkie elementy podrzędne:Aby to działało, potrzebujemy opakowania, które kończy swoje dzieci po otrzymaniu
duende :SIGTERM
odstart-stop-daemon
. Tam jest trochę:Uwaga:
uid=65534
jest użytkownikiemnobody
.Plusy : działa i jest stosunkowo łatwe.
demon :Wady : 4 procesy (nadzorca
duende
, jego rozwidlenie z utraconymi uprawnieniami (rejestrator)su
i sam demon); obowiązkowe--chroot
; Jeśli demon natychmiast się zakończy (np. Nieprawidłowa komenda)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
zgłoś, że został pomyślnie uruchomiony.Zalet : 3 procesy (promotor
daemon
,su
i demon siebie).Wady : Trudne w zarządzaniu
$PIDFILE
ze względu na mylące opcje wiersza poleceń demona ; Jeśli demon natychmiast się zakończy (np. Nieprawidłowa komenda)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
zgłoś, że został pomyślnie uruchomiony.pipexec ( zwycięzca ):
Zalet : 3 procesy (promotor
pipexec
,logger
i demon siebie); Jeśli demon natychmiast się zakończy (np. Nieprawidłowa komenda),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
poprawnie zgłoś błąd.Wady : brak.
Oto zwycięzca - najłatwiejsze, zgrabne rozwiązanie, które wydaje się działać dobrze.
źródło
Zwykle
start-stop-daemon
zamyka standardowe deskryptory plików, gdy działa w tle. Ze strony podręcznika manstart-stop-daemon
:Ten pracował dla mnie:
źródło
Cytując starą listę mailingową:
https://lists.ubuntu.com/archives/ubuntu-uk/2005-June/000037.html
źródło
Nie jestem pewien, czy „$ DAEMON $ DAEMON_ARGS> /var/log/some.log 2> & 1” kiedykolwiek zamknie deskryptor pliku dla pliku dziennika ... co oznacza, że jeśli twój demon będzie działał wiecznie, nie jestem pewien że logrotate lub inne mechanizmy czyszczenia miejsca na dysku będą działać. Ponieważ jest to> zamiast >>, sugerowane polecenie spowodowałoby również obcięcie istniejących dzienników przy ponownym uruchomieniu. Jeśli chcesz zobaczyć, dlaczego demon się zawiesił i uruchamia się ponownie automatycznie, może to nie być zbyt pomocne.
Inną opcją może być „$ DAEMON | logger”. logger to polecenie, które będzie logować się do syslog (/ var / log / messages). Jeśli potrzebujesz również stderr, myślę, że możesz użyć „$ DAEMON 1> & 2 | logger”
źródło
>>
jest generalnie bardziej odpowiednie dla demonów, chociaż sugeruje, że powinieneś teraz utworzyć regułę logrotate!--no-close ... | logger
nie działa dla mnie (Debian 7.3, start-stop-daemon 1.16.12). Skrypt start-stop-daemon nie wraca, chociaż / var / log / messages jest wypełnione :-). Próbowałem z i bez1>&2
.Zakładając, że jest to bash (chociaż niektóre inne powłoki również na to pozwalają), wiersz:
wyśle wszystkie przyszłe standardowe wyjście do tego pliku. Dzieje się tak, ponieważ
exec
bez nazwy programu po prostu wykonuje magię przekierowania. Ze strony podręcznikabash
:Zarządzanie tym plikiem to oczywiście inna kwestia.
źródło
start-stop-daemon
wersie, o którym wspomniało pierwsze pytanie?Co powiesz na:
źródło