Czy istnieje sposób, aby dzienniki wyświetlały dzienniki z „ostatniego uruchomienia foo.service”?


16

Szczególnie mnie to interesuje, gdy spojrzę na wyniki usług oneshot, które działają na zegarze. --unitFlaga jest blisko, ale nie skleja wszystkie te serie usługi razem. Najbardziej oczywistym sposobem, jaki mogę wymyślić, byłoby filtrowanie na PID, ale to sprawia, że ​​martwię się o ponowne użycie PID / usługi, które rozwidlają się, a uzyskanie ostatniego PID jest dość niewygodne. Czy istnieje jakiś inny identyfikator odpowiadający jednemu uruchomieniu usługi, którego można użyć do filtrowania dzienników?

EDYCJA: Z radością przyjąłbym wiarygodne „nie”, jeśli to jest prawdziwa odpowiedź.

Odpowiedzi:


8

Od systemdwersji 232mamy pojęcie ID wywołania. Każde uruchomienie jednostki ma unikatowy 128-bitowy identyfikator wywołania. W odróżnieniu od tego, MainPIDktóry może zostać poddany recyklingowi lub ActiveEnterTimestampktóry może powodować problemy z rozdzielczością, jest to bezpieczny sposób na uzyskanie całego dziennika wywołania określonej jednostki systemowej.

Aby uzyskać najnowszy identyfikator wywołania jednostki

$ systemctl show --value -p InvocationID openipmi
bd3eb84c3aa74169a3dcad2af183885b

Aby uzyskać dziennik ostatniego wywołania, powiedzmy openipmi, czy się nie powiodło, możesz użyć jednej linijki

$ journalctl _SYSTEMD_INVOCATION_ID=`systemctl show -p InvocationID --value openipmi.service`
-- Logs begin at Thu 2018-07-26 12:09:57 IDT, end at Mon 2019-07-08 01:32:50 IDT. --
Jun 21 13:03:13 build03.lbits openipmi[1552]:  * Starting ipmi drivers
Jun 21 13:03:13 build03.lbits openipmi[1552]:    ...fail!
Jun 21 13:03:13 build03.lbits openipmi[1552]:    ...done.

(Pamiętaj, że --valueopcja jest dostępna od systemd 230, starsza niż InvocationID)


1
Jeśli ktoś próbuje to zbadać: journalctl --user -u UNITFILE -f -o json-prettymoże być pomocny; szukasz MESSAGEw szczególności pól. Dowiedziałem się, że możesz również potrzebować USER_INVOCATION_ID, a także niektóre wiadomości nie mają przypisanego identyfikatora wywołania, więc nie można ich przefiltrować przez ten mechanizm. Nie wiem dlaczego, może moje logowanie jest źle skonfigurowane ..
— karlicoss

14

Nie jestem pewien, który znacznik czasu jest najbardziej sensowny, ale to działa dla mnie. Mamy nadzieję, że istnieje lepszy sposób pracy ze znacznikami czasu od systemctl showawk - nie udało się ustalić, jak kontrolować format znaczników czasu.

unit=foo.service

ts=$(systemctl show -p ActiveEnterTimestamp $unit)

echo $ts
ActiveEnterTimestamp=Fri 2016-11-11 12:30:01 MST

journalctl -u $unit --since "$(echo $ts | awk '{print $2 $3}')"

Na wszelki wypadek, gdy ktoś potrzebuje go jako jednej linijki: journalctl --since " systemctl show -p ActiveEnterTimestamp thermo.service | awk '{print $2 \" \" $3}'" -fu thermo.service | mniej
— DimanNe

Możesz także użyć systemctl show -p ActiveEnterTimestamp --value $unit, więc nie ma potrzeby dodatkowego awk
— karlicoss

4

Za pomocą flagi rozruchowej można pobrać tylko dzienniki z tego rozruchu. na przykład

journalctl _SYSTEMD_UNIT=avahi-daemon.service -b 5

2
Jest to podobne do tego, czego chcę, ale nie działa w sytuacjach takich jak: 1) jeśli komputer został ponownie uruchomiony od ostatniego uruchomienia usługi, lub 2) jeśli usługa uruchomiła się wiele razy od ostatniego uruchomienia.
— Jack O'Connor

Nie jestem pewien, dlaczego to nie działa w pierwszym przypadku. Jeśli został zrestartowany, również zostanie zrestartowany. Musisz tylko przejść do tego konkretnego rozruchu i pobrać swoje informacje. Jeśli chodzi o drugi ... masz rację. Dzienniki hałasu zależą od tego, ile razy usługa została ponownie uruchomiona. Ale kiedy zauważysz swój identyfikator usługi, możesz go przefiltrować za pomocą argumentu _PID = XXX. Szanse na ponowne użycie tego samego pid dla tej samej usługi w tym samym cyklu rozruchowym są ..... nie mam pojęcia ... ale prawie niemożliwe.
— Nikolaidis Fotis

Interesuje mnie obsługa usług, które niekoniecznie uruchamiają się podczas rozruchu, albo dlatego, że działają na czasach, albo dlatego, że są to jednorazowe polecenia.
— Jack O'Connor,

4

Mogą ci pomóc:

  • journalctl -u foo.service | ogon -n 2

    lub zamień 2 na oczekiwaną liczbę linii

  • journalctl -u foo.service --since = ' 2016-04-11 13:00:00 '

Możesz również połączyć je, aby uzyskać najpierw znacznik czasu ostatniego uruchomienia, a następnie użyć tego znacznika czasu z przełącznikiem --since.


To wydaje się być obejściem podobnym do podejścia PID, ale jest bardzo ręczne. Jeśli moja usługa działa przez wiele sekund i wyrzuca wiele wierszy dziennika, muszę rozpocząć wyszukiwanie pierwszego wiersza, który ma znacznik czasu rozpoczęcia, na którym mi zależy. To nie zadziała bardzo dobrze w skrypcie.
— Jack O'Connor,

3

Możesz używać filtrów pól z Journalctl. Na przykład

journalctl _PID=1234

Uzyskaj listę wszystkich dostępnych pól, używając:

journalctl --fields --unit kubelet

Jedno dostępne pole to _PID.

Możesz uzyskać PID uruchomionego procesu za pomocą pidoflubsystemctl show --property MainPID <SERVICE_NAME>

Oto, w jaki sposób otrzymuję dzienniki z bieżącego procesu Kubeletetes Kubelet:

# journalctl --unit kubelet _PID=$(systemctl show --property MainPID kubelet 2>/dev/null | cut -d= -f2) | head

Teraz powiedz mi, dlaczego I Kubernetes jest tak trudny do zainstalowania :-(


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.