Obecnie próbuję utworzyć jednostkę systemową jako serwer WWW. Obecnie mój foo.service
plik wygląda następująco:
[Unit]
Description=The Foo Web Server
[Service]
Type=simple
ExecStart=/opt/foo/.cabal-sandbox/bin/foo
[Install]
WantedBy=multi-user.target
Plik foo
wykonywalny automatycznie rejestruje wszystkie żądania HTTP na standardowe wyjście - jest to dobrze przetestowane. Jednak gdy przeglądam dzienniki za pomocą journalctl -u foo
, otrzymuję tylko takie dane wyjściowe:
...
May 06 17:46:57 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:46:57 localhost systemd[1]: Started Foo Web Server.
May 06 17:46:57 localhost systemd[1]: Starting The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Stopping The Foo Web Server...
May 06 17:47:08 localhost systemd[1]: Started The Foo Web Server.
May 06 17:47:08 localhost systemd[1]: Starting The Foo Web Server...
Czy ktoś mógłby wyjaśnić, dlaczego nie rejestruje wszystkich danych wyjściowych standardowego wyjścia? Spojrzałem krótko na to poprzednie pytanie , ale to nie pomaga - jednak odnosiło się do czegoś w stylu „... może nie działać w systemach, które nie używają pełnego systemu” - czy tak byłoby w przypadku Ubuntu 15.04 ? Z góry dziękuję za wszelką pomoc.
print('Hello World!', flush=True)
i to załatwiło sprawę! Dane wyjściowe zaczęły się pojawiać w dzienniku.Odpowiedzi:
W rzeczywistości buforowanie w UNIXie zależy od kontekstu: kiedy stdout jest przekierowywany do czegoś interaktywnego, takiego jak konsola - zwykle jest buforowany liniowo, w przeciwnym razie jest w pełni buforowany.
Buforowanie można zmienić w aplikacji za pomocą wywołania biblioteki setvbuf .
Ale można to również zrobić za pomocą komendy stdbuf podczas uruchamiania:
(w przypadku buforowanym wierszem)
źródło
ExecStart=/my/foo/program
, dlaczego log stdout nie jest opróżniany po zakończeniu usługi, ale całkowicie znika.Domyślnie w Ubuntu 15.04 , czasopisma systemowe są niestabilne i są przechowywane
/run/systemd/journal
i są tracone przy każdym ponownym uruchomieniu. Aby korzystać z trwałego dziennika systemd , musisz utworzyć/var/log/journal
katalog (i zrestartować systemd-journald.service).Być może
stdout
dane wyjściowe są po prostu przekierowywane do dziennika systemowegosyslog
i nie są przechowywane . W tym celu może być konieczne użycie trwałego dziennika systemowego, jak wyjaśniono powyżej.Czy sprawdziłeś
/var/log/syslog
swójfoo
dziennik?źródło
/var/log/journal
jak wspomniałeś, ale i tak nie widzę standardowej usługi. w/var/log/syslog
I nie widzę tego.