Wyświetl stdout / stderr usługi systemd


175

Utworzyłem prosty systemowy plik usługi dla aplikacji niestandardowej. Aplikacja działa dobrze, gdy uruchamiam ją ręcznie, ale mój procesor jest maksymalnie obciążony, gdy uruchamiam ją z systememd.

Próbuję wyśledzić, gdzie jest mój problem, ale nie wiem, gdzie znaleźć dane wyjściowe (ani jak skonfigurować systemd, aby gdzieś dane wyjściowe).

Oto mój plik usługi:

[Unit]
Description=Syncs files with a server when they change
Wants=network.target
After=network.target

[Service]
ExecStart=/usr/local/bin/filesync-client --port 2500
WorkingDirectory=/usr/local/lib/node_modules/filesync-client
Restart=always

[Install]
WantedBy=multi-user.target

W całej aplikacji przesyłam dane wyjściowe do stdout i stderr.

Jak mogę odczytać dane wyjściowe mojego demona?

Edytować:

Znalazłem man systemd.exec, który wspomniał o StandardOutput=opcji, ale nie jestem pewien, jak jej użyć. Od strony man :

StandardOutput=

Kontroluje połączenie deskryptora pliku 1 (STDOUT) wykonanych procesów. Pobiera jeden z dziedziczenia , null , tty , syslog , kmsg , kmsg + console , syslog + console lub socket .

Jeśli ustawione na dziedziczenie , deskryptor pliku standardowego wejścia jest duplikowany dla standardowego wyjścia. Jeśli ustawione na zero, standardowe wyjście zostanie podłączone /dev/null, tzn. Wszystko, co do niego zostanie zapisane, zostanie utracone. Jeśli ustawione na tty, standardowe wyjście zostanie podłączone do tty (zgodnie z konfiguracją za pośrednictwem TTYPath=, patrz poniżej). Jeśli TTY zostanie użyty do wyjścia, tylko wykonany proces nie stanie się procesem kontrolnym terminala i nie zawiedzie ani nie będzie czekać na zwolnienie terminala przez inne procesy. syslog łączy standardowe wyjście z rejestratorem systemowym syslog (3). kmsg łączy go z buforem dziennika jądra, który jest dostępny przez dmesg (1). syslog + konsola i kmsg + konsoladziałają podobnie, ale również skopiuj dane wyjściowe do konsoli systemowej. gniazdo łączy standardowe wyjście z gniazdem po aktywacji gniazda, semantyka jest podobna do odpowiedniej opcji StandardInput=. To ustawienie domyślnie dziedziczy.

Czy to oznacza, że ​​są to moje jedyne opcje? Chciałbym na przykład umieścić dane wyjściowe /dev/shmlub coś takiego. Przypuszczam, że mógłbym użyć gniazda domeny Unix i napisać prosty odbiornik, ale wydaje się to trochę niepotrzebne.

Potrzebuję tego tylko do debugowania i prawdopodobnie skończę usuwając większość dzienników i zmieniając dane wyjściowe na syslog.


Czy próbowałeś sprawdzić /var/log/syslogdane wyjściowe? Większość systemów zaloguje się, /var/log/więc zacznę od sprawdzenia. Możesz użyć grepdo wyszukiwania tekstu, jeśli znasz wynik: grep "my output" /var/logpowinien załatwić sprawę .
sbtkd85

@ sbtkd85 - Cóż, nie mam /var/log/syslog, ale załatwia sprawę /var/log/messages. Problem polega na tym, że według dzienników mój demon ulega awarii przy starcie, ale mogę stwierdzić, że nadal działa, ponieważ ma serwer HTTP i mogę go zapytać. Wygląda na to, że reszta dzienników gubi się ...
beatgammit,

Dlaczego nie spróbować ustawić, StandardOutput=ttyaby zobaczyć, co się dzieje po uruchomieniu demona. Powinien on wypisać terminal (być może będziesz musiał użyć ttyS0lub podobny, aby uzyskać wynik na ekranie).
sbtkd85

3
W tym kontekście nie powinny działać standardowe operatory przekierowania We / Wy. Coś w styluExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Deepak Mittal,

Co tak naprawdę nadużywa procesor? Czy to systemd, twoja usługa lub system (np. Przez tworzenie nowych kopii usługi, ponieważ systemd zwariował)?
peterph

Odpowiedzi:


183

Aktualizacja

Jak zauważa mikemaccana, dziennik systemowy jest teraz standardowym urządzeniem rejestrującym dla większości dystrybucji. Aby wyświetlić stdouti stderrjednostki systemowej, użyj journalctlpolecenia.

sudo journalctl -u [unit]

Oryginalna odpowiedź

Domyślnie stdouti stderrz Systemd jednostki są wysyłane do syslog.

Jeśli używasz pełnego systemu, będzie to możliwe poprzez journalctl. Na Fedorze powinno być, /var/log/messagesale syslog umieści go tam, gdzie mówią twoje reguły.

Z powodu daty postu i zakładając, że większość ludzi, którzy są narażeni na systemd, są za pośrednictwem fedory, prawdopodobnie zostałeś dotknięty błędem opisanym tutaj: https://bugzilla.redhat.com/show_bug.cgi?id=754938 Ma dobre wyjaśnienie, jak to wszystko też działa =) (Był to błąd w polityce selinux, który powodował, że komunikaty o błędach nie były rejestrowane i został naprawiony selinux-policy-3.10.0-58.fc16)


5
Pamiętaj, że użycie standardowego mechanizmu rejestrowania takiego jak ten nie spowoduje domyślnego utworzenia trwałych dzienników. Aby to zrobić, musisz utworzyć / var / log / journal, a następnie uruchomićsudo systemctl restart systemd-journald
mlissner

1
jaki obiekt i priorytet syslog?
jrwren

2
To zadziałało dla mnie: StandardOutput=syslog+consolea StandardError=syslog+consolepotem cała produkcja z mojego urządzenia pojawiła się w dzienniku. Najwyraźniej ustawienie domyślne było nieprawidłowe. (Takich jak DefaultStandardOutput w /etc/systemd/system.conf)
gregn3

2
-fbył dla mnie pomocny. Śledził dziennik, gdy następowały zmiany (przypadek użycia następował po serwerze Minecraft, który działał jako demon)
blaughw

2
Doprowadza mnie to do szaleństwa ... Na standardowym dzienniku stretch Debiana nie pokaże mi żadnego standardowego wyjścia. Nawet używam /usr/bin/stdbuf -oL <cmd>i wyraźne StandardOutput=journal. Wciąż nic.
jlh 18.12.18

81

Krótsza, prostsza, nie-starsza odpowiedź:

sudo journalctl -u [unitfile]

Gdzie [unitfile] to .servicenazwa systemowa . Np. Aby zobaczyć wiadomości od myapp.service,

sudo journalctl --unit=myapp

Aby śledzić dzienniki w czasie rzeczywistym:

sudo journalctl -f -u myapp

4
Pamiętaj, że może być konieczne, sudojeśli pojawi się No journal files foundbłąd.
bigjosh,

5
syslog nie jest dziedzictwem ...
Miles Rout

2
Jest w obecnych dystrybucjach Linuksa. Możesz naprawdę polubić syslog, ale to nie zmienia tego, z czym są dostarczane.
mikemaccana

1
Pewnie. I używa również syslog. Nie chodziło mi o to, że systemd nie jest używany, ale syslog nie jest dziedzictwem.
labirynt

6
@JECompton, jeśli wszystkie logowania na obecnych dystrybucjach Linuksa używają dziennika, a syslog nie jest konieczny i służy wyłącznie do zachowania zgodności, logicznie wynika z tego, że syslog jest dziedzictwem.
mikemaccana
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.