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.
/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
/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ę .