スーパーバイザの子 stdout.log: リアルタイム読み取り

スーパーバイザの子 stdout.log: リアルタイム読み取り

スーパーバイザーはいくつかの子プロセスをアクティブ化します。

それぞれを次のように設定しました。

[program:XXXXX]
command=/XXXXX/XXXXX
directory=/XXXXXX
autostart=true
autorestart=true
startsecs=3
startretries=10000
stdout_logfile=/XXXXXX/stdout.log
stdout_logfile_maxbytes=1MB
stderr_logfile=/XXXXXX/stderr.log
stderr_logfile_maxbytes=1MB

プロセスの 1 つは、テスト中にリアルタイムで読み取りたい大量の画面出力を生成しています。1 秒ごとに 5 行が印刷されます。

ログインしましたstdout.log

stdout.log私は一緒に読もうと思った

watch -0.1 tail /XXXXX/stdout.log

しかし、各行を受信して​​も更新されないことがわかります。ログの内容は、ファイルに保存される前に、事前に定義されたサイズに達するまでキャッシュされる可能性があります。

将来の参照用に stdout を保持する必要はありません。

スーパーバイザーを設定する可能性はありますか?継続的に更新 stdout.log?

または、長期的にディスクを損傷するのを避けるために、 の最後の X 行をstdout保存せずに印刷し直すことは可能でしょうかstdout.log?

答え1

ディスクの損傷を避けたい場合 (長い間、これを心配する人は見たことがありません)、次のようにログ ファイルを送信する RAM ディスクを作成できます。

mkdir /var/log/tmplogs
mount -t tmpfs -o size=5m tmpfs /var/log/tmplogs

または fstab 形式の場合:

tmpfs       /var/log/tmplogs   nodev,nosuid,noexec,nodiratime,size=5M 0 0

そして、この/var/log/tmplogsディレクトリをそれらのファイルの保存先として使用します。

これは、ログバッファリングの問題を解決しません。しかし、通常、遅延はコマンドが出力をバッファリングすることによって発生し(ttyの有無で動作が異なる場合があります)、supervisordが原因ではありません。supervisordの例に従って確認することができます。803号

Supervisor が stdout.log を継続的に更新するように設定することは可能ですか?

受信するとすぐにログを書き込むように既に設定されており、これはほとんど supervisord の問題ではないため、いいえと言いますが、コマンドを起動しないと、バグが発生しているのか、コマンドによって正常であるのかを判断する方法はありません。

関連情報