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.