サービスが最後に再起動されてからJournalctlからすべてのログを取得する正規の方法はありますか?私が望むのは、サービスを再起動し、再起動が開始された後のすべてのログをすぐに確認することです。
私は次のことを思い出しました。
$ unit=prometheus
$ sudo systemctl restart $unit
$ since=$(systemctl show $unit | grep StateChangeTimestamp= | awk -F= '{print $2}')
$ sudo systemctl status -n0 $unit && sudo journalctl -f -u $unit -S "$since"
これはうまくいくかもしれませんが、再起動してその時点からすべてのログを提供するより具体的な方法があるかどうか疑問に思います。
答え1
あなたはそれを使用することができます通貨ID、これはサービスユニットの特定の実行の一意の識別子です。
それ紹介するsystemd v232では、正常に機能するには少なくともそのバージョンのsystemdが必要です。
現在実行中のサービスの呼び出しIDを取得するには:
$ unit=prometheus
$ systemctl show -p InvocationID --value "$unit"
0e486642eb5b4caeaa5ed1c56010d5cf
次に、その呼び出しIDが追加されたジャーナル項目を検索します。
$ journalctl INVOCATION_ID=0e486642eb5b4caeaa5ed1c56010d5cf + _SYSTEMD_INVOCATION_ID=0e486642eb5b4caeaa5ed1c56010d5cf
すべてのログを取得するには、INVOCATION_IDと_SYSTEMD_INVOCATION_IDが必要であることがわかりました。後者はデバイス自体のログ出力(このサービスで実行されるプロセスの標準出力)のためにsystemdによって追加されますが、前者はsystemdから取得されたイベント(デバイスの「Starting」および「Has」など)に追加されます。になります。 「スタート」メッセージ)。 )
ないので参考にしてください必要組織名でフィルタリングすることもできます。呼び出しIDは一意であるため、ID自体でフィルタリングするだけで、関心のあるサービスのログのみを含めるのに十分です。
答え2
@filbrandenの答えで新しいことを学び、受け入れましたが、その技術が一般化されていないことがわかりました。たとえば、サービスを停止して終了ログを表示しようとすると、停止したサービスに請求書IDがないため、この手法は機能しません。
私はより基本的な技術を使うようになりました。単にコマンドの前の時間を保存し、それ以降のすべてのログを表示するだけです。
status_from() { sudo systemctl status -l --no-pager -n0 $1; echo; sudo journalctl -f -u $1 -S "$2"; }
start() { dt=$(date +'%a %Y-%m-%d %T %Z'); sudo systemctl start $1; status_from $1 "$dt"; }
stop() { dt=$(date +'%a %Y-%m-%d %T %Z'); sudo systemctl stop $1; status_from $1 "$dt"; }
restart() { dt=$(date +'%a %Y-%m-%d %T %Z'); sudo systemctl restart $1; status_from $1 "$dt"; }