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średnictwemTTYPath=
, 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 opcjiStandardInput=
. 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/shm
lub 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.
źródło
/var/log/syslog
dane wyjściowe? Większość systemów zaloguje się,/var/log/
więc zacznę od sprawdzenia. Możesz użyćgrep
do wyszukiwania tekstu, jeśli znasz wynik:grep "my output" /var/log
powinien załatwić sprawę ./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ę ...StandardOutput=tty
aby zobaczyć, co się dzieje po uruchomieniu demona. Powinien on wypisać terminal (być może będziesz musiał użyćttyS0
lub podobny, aby uzyskać wynik na ekranie).ExecStart=/usr/local/bin/filesync-client --port 2500 2>/tmp/filesync.log
Odpowiedzi:
Aktualizacja
Jak zauważa mikemaccana, dziennik systemowy jest teraz standardowym urządzeniem rejestrującym dla większości dystrybucji. Aby wyświetlić
stdout
istderr
jednostki systemowej, użyjjournalctl
polecenia.Oryginalna odpowiedź
Domyślnie
stdout
istderr
z 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/messages
ale 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
)źródło
sudo systemctl restart systemd-journald
StandardOutput=syslog+console
aStandardError=syslog+console
potem 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)-f
był dla mnie pomocny. Śledził dziennik, gdy następowały zmiany (przypadek użycia następował po serwerze Minecraft, który działał jako demon)/usr/bin/stdbuf -oL <cmd>
i wyraźneStandardOutput=journal
. Wciąż nic.Krótsza, prostsza, nie-starsza odpowiedź:
Gdzie [unitfile] to
.service
nazwa systemowa . Np. Aby zobaczyć wiadomości odmyapp.service
,Aby śledzić dzienniki w czasie rzeczywistym:
źródło
sudo
jeśli pojawi sięNo journal files found
błąd.