終了する前に、システムロギングの最後の行の単位属性をどのように変更できますか?

終了する前に、システムロギングの最後の行の単位属性をどのように変更できますか?

stdoutに記録するシステムサービスがあります。そこで、systemdはSTDOUTをキャプチャしてログに書き込みます。

私はエラーを処理するために一般的なイディオムを使用します。ここでechoいくつかの診断を実行し、ゼロ以外のエラーコードで終了します。

echo "my final error";
exit 1;

私の問題は、この最後の行がジャーナルにecho表示されますが、私の「単位」と正しく接続されていないことです。を見ると、journalctl -o json-pretty違いが何であるかがわかります。最終ログ・レコードに _SYSTEMD_CGROUP および _SYSTEMD_UNIT 属性がありません。

私は何が起こっているのか競争条件だと思います。私はbashスクリプトがjournald終了行に入る前に完全な処理を待っていないようです。したがって、exitログエントリの処理が完了する前にその行に到達します。ログが送信されたログを参照しましたが、デバイスが実行されなくなったため、現在は見つかりませんでした。journaldjournaldunit

sleep 1私の言葉が正しい場合は、おそらく私のドアの前にプレフィックスを付けてこの問題を解決することができますexit 1。しかし、最後のログ属性を取得するより良い方法はありますか?

systemd私はバージョン229を使用してUbuntu 16.04を使用しています。

ベストアンサー1

@mark-stosberg、これは既知の問題です。Journaldは、SCM_CREDSと競合する/ procのために終了したプロセスからの着信メッセージをそのcgroupに帰属させることはできません。

回避策は次のとおりです。https://github.com/systemd/systemd/issues/2913#issuecomment-219702148

努力するSyslogIdentifier=

ロギングシステムまたはカーネルログバッファに送信されるログ行のプレフィックスとしてプロセス名を設定します。

そして走るjournalctl _SYSTEMD_UNIT=unit + UNIT=unit + SYSLOG_IDENTIFIER=id

おすすめ記事