web-dev-qa-db-ja.com

"前回のfoo.serviceの実行"からjournalctlにログを表示させる方法はありますか?

タイマーで実行されるoneshotサービスの出力を確認するために、これに特に興味があります。 --unitフラグは閉じていますが、サービスのすべての実行を連結します。私が考えることができる最も明白な方法は、PIDでフィルタリングすることですが、それによって、PIDの再利用/フォークするサービスが心配になり、最後のPIDを取得するのはかなり不便です。ログのフィルタリングに使用できる、サービスの1回の実行に対応する他の識別子はありますか?

編集:それが本当の答えであれば、私は権威ある「いいえ」を喜んで受け入れます。

16
Jack O'Connor

systemdバージョン232以降、呼び出しIDの概念があります。ユニットが実行されるたびに、ユニットには一意の128ビットの呼び出しIDがあります。リサイクルできるMainPIDや解決の問題が発生する可能性があるActiveEnterTimestampとは異なり、これは特定のsystemdユニット呼び出しのすべてのログを取得するためのフェイルセーフな方法です。

ユニットの最新の呼び出しIDを取得するには

$ systemctl show --value -p InvocationID openipmi
bd3eb84c3aa74169a3dcad2af183885b

たとえばopenipmiの最新の呼び出しのジャーナルを取得するには、失敗したかどうかにかかわらず、1つのライナーを使用できます。

$ 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.

--valueは、InvocationIDより古いsystemd 230以降で使用できます)

8

どのタイムスタンプが最も意味があるかわかりませんが、これは私にとってはうまくいきます。うまくいけば、awkよりもsystemctl showからのタイムスタンプを使用するより良い方法がある-タイムスタンプの形式を制御する方法を理解できなかった。

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}')"
14
Erik Stephens

ブートフラグを使用して、そのブートからログのみをフェッチできます。例えば

journalctl _SYSTEMD_UNIT=avahi-daemon.service -b 5
4

これらはあなたを助けるかもしれません:

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

    または2を予想される行数に置き換えます

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

それらを組み合わせて、最初に最後のランタイムのタイムスタンプを取得し、そのタイムスタンプを--sinceスイッチで使用することもできます。

4
Breign

Journalctlでフィールドフィルターを使用できます。例えば。

journalctl _PID=1234

以下を使用して、使用可能なすべてのフィールドのリストを取得します。

journalctl --fields --unit kubelet

使用可能なフィールドの1つは_PIDです。

pidofまたはsystemctl show --property MainPID <SERVICE_NAME>を使用して、実行中のプロセスのPIDを取得できます

現在のKubernetes kubeletプロセスからログを取得する方法は次のとおりです。

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

Kubernetesのインストールが難しい理由を教えてください:-(

3
richardw

journalctl -r | grep -m1 foo.service

0
nieman