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
答え2
これについて少し調べてみましたが、そういうことです。systemdの既知の問題、プル要求があります。。
修正には、サービスが終了しても、そのメタデータを引き続き使用して最後のいくつかのログを正しく分類できるように、サービスのメタデータをキャッシュすることが含まれます。
それも考慮されるCoreOSでバグを開く、systemdを使用します。
このバグは、次のようにsystemd freedesktop.orgのバグトラッカーでも追跡されます。
さらなるテストは、ログ所有権の喪失の問題がより深刻であることを示しました。ユーザー単位 - これは別の問題だと思います。 ~のためシステムユニット、競合状態は比較的マイナーであり、sleep 1;
サービススクリプトで終了前に追加すると、印刷された最後のログと終了前の間に十分なパディングを追加することで問題を解決できます。