stdoutに記録するシステムサービスがあります。そこで、systemdはSTDOUTをキャプチャしてログに書き込みます。
私はエラーを処理するために一般的なイディオムを使用します。ここでecho
いくつかの診断を実行し、ゼロ以外のエラーコードで終了します。
echo "my final error";
exit 1;
私の問題は、この最後の行がジャーナルにecho
表示されますが、私の「単位」と正しく接続されていないことです。を見ると、journalctl -o json-pretty
違いが何であるかがわかります。最終ログ・レコードに _SYSTEMD_CGROUP および _SYSTEMD_UNIT 属性がありません。
私は何が起こっているのか競争条件だと思います。私はbashスクリプトがjournald
終了行に入る前に完全な処理を待っていないようです。したがって、exit
ログエントリの処理が完了する前にその行に到達します。ログが送信されたログを参照しましたが、デバイスが実行されなくなったため、現在は見つかりませんでした。journald
journald
unit
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
ロギングシステムまたはカーネルログバッファに送信されるログ行のプレフィックスとしてプロセス名を設定します。
そして走る
journalctl _SYSTEMD_UNIT=unit + UNIT=unit + SYSLOG_IDENTIFIER=id