私はスーパーバイザーを使用して複数のプロセスを実行することを計画しており、以下の supervisord.conf ファイルを見つけてください。
[supervisord]
[program:bash]
command=xyz
stdout_logfile =/tmp/bash.log
redirect_stderr=true
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock
[unix_http_server]
file=/tmp/supervisor.sock ; path to your socket file
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
bashというプロセスのstdoutをスーパーバイザコンソールにリダイレクトして、スーパーバイザを起動するときに
/usr/bin/supervisord
コマンドを実行すると、子プロセスのログを見ることができます。どうすればいいでしょうか? stdout_logfile 属性に syslog を設定してみましたが、うまくいきませんでした。
ベストアンサー1
次の設定オプションを使用して、プログラムの stdout をスーパーバイザの stdout にリダイレクトできます。
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
説明:
- プロセスが開くと
/dev/fd/1
( と同じ/proc/self/fd/1
)、システムは実際にそのプロセスのファイル記述子 #1(stdout)を複製します。stdout_logfile
したがって、これを として使用するとsupervisord
、 はプログラムの stdout を独自の stdout にリダイレクトします。 stdout_logfile_maxbytes=0
ログ ファイルのローテーションを無効にしますが、これは明らかに stdout には意味がありません。このオプションを指定しないと、デフォルト値が 50 MB であり、指定されたログ ファイルが通常のファイルではないことをスーパーバイザーが検出できないため、エラーが発生します。
詳細については:
http://veithen.github.io/2015/01/08/supervisord-redirecting-stdout.html