systemd w dniu 15.04 nie zarejestruje standardowej jednostki

12

Obecnie próbuję utworzyć jednostkę systemową jako serwer WWW. Obecnie mój foo.serviceplik 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 foowykonywalny 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.

Athan Clark
źródło
1
Upewnij się, że proces nie buforuje danych wyjściowych. Miałem podobny problem, który został rozwiązany przez wyłączenie buforowania danych wyjściowych mojego skryptu Pythona. Ponieważ liczba wygenerowanych rekordów dziennika nie była wysoka, wyglądało na to, że nie ma rejestrowania, ale w rzeczywistości nie miał jeszcze szansy, ponieważ wszystko wciąż gromadziło się w buforze wyjściowym standardowego wyjścia.
Jan Vlcinsky
1
Próbuję to naprawić. Mam wrażenie, że systemd buforuje. stdout jest buforowany liniowo w UNIX-ie, ale systemd robi swoje i buforuje o wiele więcej (aby być szybkim, ale może bezużytecznym).
Velkan
Miałem ten sam problem i problem polegał na buforowaniu przy pomocy funkcji drukowania Pythona! Odkąd korzystałem z Python 3, użyłem czegoś podobnego print('Hello World!', flush=True)i to załatwiło sprawę! Dane wyjściowe zaczęły się pojawiać w dzienniku.
timbram

Odpowiedzi:

9

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:

ExecStart=/usr/bin/stdbuf -oL /opt/foo/.cabal-sandbox/bin/foo

(w przypadku buforowanym wierszem)

Velkan
źródło
To uratowało mi dzień! Dziękuję Ci bardzo. Ale jestem trochę mylony z tym ExecStart=/my/foo/program, dlaczego log stdout nie jest opróżniany po zakończeniu usługi, ale całkowicie znika.
wlnirvana
0

Domyślnie w Ubuntu 15.04 , czasopisma systemowe są niestabilne i są przechowywane /run/systemd/journali są tracone przy każdym ponownym uruchomieniu. Aby korzystać z trwałego dziennika systemd , musisz utworzyć /var/log/journalkatalog (i zrestartować systemd-journald.service).

Być może stdoutdane 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/syslogswój foodziennik?

przesilenie dnia z nocą
źródło
Stworzyłem, /var/log/journaljak wspomniałeś, ale i tak nie widzę standardowej usługi. w /var/log/syslogI nie widzę tego.
wyloguj się