タイマーで実行されるoneshotサービスの出力を確認するために、これに特に興味があります。 --unit
フラグは閉じていますが、サービスのすべての実行を連結します。私が考えることができる最も明白な方法は、PIDでフィルタリングすることですが、それによって、PIDの再利用/フォークするサービスが心配になり、最後のPIDを取得するのはかなり不便です。ログのフィルタリングに使用できる、サービスの1回の実行に対応する他の識別子はありますか?
編集:それが本当の答えであれば、私は権威ある「いいえ」を喜んで受け入れます。
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
以降で使用できます)
どのタイムスタンプが最も意味があるかわかりませんが、これは私にとってはうまくいきます。うまくいけば、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}')"
ブートフラグを使用して、そのブートからログのみをフェッチできます。例えば
journalctl _SYSTEMD_UNIT=avahi-daemon.service -b 5
これらはあなたを助けるかもしれません:
journalctl -u foo.service |尾-n 2
または2を予想される行数に置き換えます
journalctl -u foo.service --since = '2016-04-11 13:00:'
それらを組み合わせて、最初に最後のランタイムのタイムスタンプを取得し、そのタイムスタンプを--sinceスイッチで使用することもできます。
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のインストールが難しい理由を教えてください:-(
journalctl -r | grep -m1 foo.service