Mam usługę (napisaną przeze mnie) działającą na serwerze Debian (Jessie), a własne dzienniki usługi wskazują, że została ona uruchomiona ponownie w określonym czasie. Nic nie wskazuje na awarię lub inną awarię, więc teraz próbuję dowiedzieć się, czy aplikacja jakoś cicho zawiodła i została odrodzona przez systemd, czy też użytkownik celowo zrestartował usługę za pośrednictwem systemctl
.
Historia powłoki nie pokazuje takiej aktywności, ale nie jest to rozstrzygające z powodu export HISTCONTROL=ignoreboth
i ponieważ sesja SSH mogła właśnie przekroczyć limit czasu, uniemożliwiając zapisanie historii bashu poprzedniego logowania na dysku. Serwer nie został wówczas ponownie uruchomiony.
Spodziewałbym się jednak, że sam systemd powinien prowadzić dziennik wskazujący, kiedy usługa została celowo zrestartowana. Ku mojemu zdziwieniu nie udało mi się znaleźć żadnej dokumentacji (np. Dotyczącej journalctl
), w jaki sposób uzyskać takie dzienniki.
Niektóre inne posty (np. Gdzie jest / dlaczego nie ma dziennika dla zwykłych usług systemowych użytkownika? ) Wydają się wskazywać, że powinny być takie komunikaty dziennika:
Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Starting chatty.service...
Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Started chatty.service.
Ale nie widzę takich komunikatów w dzienniku w moim systemie.
Czy istnieje sposób, aby dowiedzieć się, kiedy usługi systemowe zostały uruchomione, zatrzymane lub ponownie uruchomione?
Edycja : Wydaje się, że typowym problemem, na który mogą natknąć się ludzie, jest to, że działają journalctl
jako użytkownicy nieuprzywilejowani. To nie dotyczy mnie, działam root
przez cały czas. W odpowiedzi na komentarz uruchomienie grep systemd /var/log/syslog
daje mi tylko to:
Jun 6 09:28:35 server systemd[22057]: Starting Paths.
Jun 6 09:28:35 server systemd[22057]: Reached target Paths.
Jun 6 09:28:35 server systemd[22057]: Starting Timers.
Jun 6 09:28:35 server systemd[22057]: Reached target Timers.
Jun 6 09:28:35 server systemd[22057]: Starting Sockets.
Jun 6 09:28:35 server systemd[22057]: Reached target Sockets.
Jun 6 09:28:35 server systemd[22057]: Starting Basic System.
Jun 6 09:28:35 server systemd[22057]: Reached target Basic System.
Jun 6 09:28:35 server systemd[22057]: Starting Default.
Jun 6 09:28:35 server systemd[22057]: Reached target Default.
Jun 6 09:28:35 server systemd[22057]: Startup finished in 59ms.
Jun 6 09:37:08 server systemd[1]: Reexecuting.
źródło
grep systemd /var/log/syslog
Stopped target Default
,Starting Shutdown
itd. Nic nie wskazuje nic na temat poszczególnych usług. Może to tylko problem z konfiguracją? Uwaga: W tym konkretnym przypadku jestem na Debianie Jessie./etc/systemd/journald.conf
nie zostało zastąpioneMaxLevelStore
lubMaxLevelSyslog
i sprawdź wszystkie inne miejsca, w których możesz skonfigurować dziennik zgodnie z listąman journald.conf
./etc/systemd
są zasadniczo puste (wszystkie opcje skomentowane, w tym te, o których wspomniałeś).Odpowiedzi:
Jeśli musisz to napisać, powinieneś skorzystać z
systemctl show
polecenia. Jest to bardziej przydatne dla skryptów niż próbowanie parsowania czegokolwiekstatus
. Na przykład, aby dowiedzieć się, kiedy usługa została ostatnio uruchomiona, możesz użyć:Jeśli chcesz zobaczyć wszystkie dostępne właściwości, po prostu pomiń flagę, a wszystkie zostaną zrzucone.
Dokumentację tych właściwości można znaleźć tutaj .
źródło
StatusErrno
iResult
? Zastanawiałbym się, czy zmieniają się one, jeśli usługa ulegnie awarii lub zostanie ponownie uruchomiona. Jeśli naprawdę potrzebujesz przejść dalej, spróbuj dodaćExecStopPost
krok, w którym dotkniesz pliku i zaktualizuj znacznik czasu podczas zamykania. Pomoże Ci to rozróżnić ciche restarty od celowych.Przy domyślnej konfiguracji Debiana nieuprzywilejowany użytkownik nie będzie miał dostępu ani do dzienników systemd ani dzienników syslog. Jeśli jesteś zalogowany jako zwykły użytkownik, otrzymasz odpowiedź z czasopisma:
co jest nieco mylące.
Jeśli jesteś zalogowany jako root,
journalctl --unit=yourservice
powinien podać ci informacje, których szukasz. Po asystemctl restart bind9
na moim serwerze otrzymuję to pojournalctl --unit=bind9
:Jeśli zabiję jawnie za pomocą bind9
kill -9
,journalctl --unit=bind9
daje:Pierwszy wiersz wskazuje, że proces zmarł, ponieważ został zabity.
systemd-journald przesyła również wszystkie wiadomości dziennika do syslog, więc powinieneś je również znaleźć w
/var/log/syslog
.Systemd i systemd-journald mają domyślnie skompilowane w konfiguracji, które można zmienić w
/etc/systemd/system.conf
i/etc/systemd/journald.conf
.Warto wiedzieć, że domyślnie systemd-Journald przechowuje logi pod
/run
, co oznaczatmpfs
, i dlatego znika po ponownym uruchomieniu. Oznacza to, że aby komunikaty dziennika były starsze niż ostatni rozruch, musisz spojrzeć na pliki syslog. W tym przypadku dziennik nie dostarczy dzienników starszych niż ostatni rozruch. Można to zmienić/etc/systemd/journald.conf
poprzez ustawienieStorage=persistent
.Strony podręcznika, które to dokumentują, to:
Należy również pamiętać, że aby usługa była restartowana automatycznie przez systemd, należy ją skonfigurować w
.service
pliku. Odman 5 systemd.service
:źródło
systemd
podczas generowania dziennika zgodnie z opisem, mimo że cały czas pracowałem jako root./var/log/syslog
też niczego nie pokazuje. Nawiasem mówiąc, jest to uporządkowane 215.Możesz zobaczyć czas ostatniego uruchomienia lub ponownego uruchomienia usługi. Użyj
service chatty status
lubsystemctl status chatty
. Oto przykłady usługi apache2 lub httpd:linia
Active: active (running) since Wen. 2017-06-02 15:53:01 CEST; 21min ago
pokazuje, jak działa usługa, ale nie wiem, czy możesz wyświetlać jak „listę” dokładnie to, czego szukasz.źródło
service
jest starą komendą Upstart, która działa z systememd dla kompatybilności. Natywnymsystemd
poleceniem jestsystemctl status apache2
.Możemy użyć
-f
opcji filtrowania wiadomości z dziennika ( https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html ).źródło