![終了前の systemd ログの最後の行のユニット属性を修正するにはどうすればよいですか?](https://rvso.com/image/89156/%E7%B5%82%E4%BA%86%E5%89%8D%E3%81%AE%20systemd%20%E3%83%AD%E3%82%B0%E3%81%AE%E6%9C%80%E5%BE%8C%E3%81%AE%E8%A1%8C%E3%81%AE%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E5%B1%9E%E6%80%A7%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
stdout にログを記録する systemd サービスがあります。そこから、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
Ubuntu 16.04でバージョン229を使用しています。
答え1
@mark-stosberg、これは既知の問題です:journald は、/proc と SCM_CREDS の競合により、終了したプロセスから受信したメッセージを 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;
サービス スクリプトの終了直前に追加すると、最後のログが印刷されて終了する前に十分なパディングが追加され、問題が回避される可能性があります。