4

スーパーバイザー (Python で記述されたプロセス コントローラー) を使用して、Web サーバーと関連サービスを開始および制御しています。サーバーの実行中にデバッグするために、pdb(または実際にはipdb)に入る必要がある場合があります。スーパーバイザーでこれを行うのに問題があります。

Supervisor は、supervisord と呼ばれるデーモンでプロセスを開始および制御できるようにし、supervisorctl と呼ばれるクライアントを介したアクセスを提供します。このクライアントを使用すると、「fg」コマンドを使用して開始されたフォアグラウンド プロセスの 1 つに接続できます。このような:

supervisor> fg webserver

すべてのログ データが端末に送信されます。しかし、pdb デバッガーからテキストを取得できません。それは私の入力を受け入れるので、標準入力は機能しているようです。

調査の一環として、送信もテキスト送信printもしていないことを確認できました。raw_inputしかしraw_input、標準入力の場合は実際に機能しています。

これが機能することも確認できました。

sys.stdout.write('message')
sys.flush()

コマンドを発行するfgと、標準端末のフォアグラウンドでプロセスを実行したかのようになると思いました...しかし、supervisorctlはさらに何かをしているようです。たとえば、通常の印刷はフラッシュしません。何か案は?

fgSupervisorctl のコマンドを使用してフォアグラウンド ターミナルに接続するときに、pdb、標準出力などを正しく動作させるにはどうすればよいですか?

(役立つ参考文献: http://supervisord.org/subprocess.html#nondaemonizing-of-subprocesses )

4

2 に答える 2

7

Python はデフォルトで出力ストリームをバッファリングすることがわかりました。特定のケース (この例など) では、出力が保留されます。

次のようなイディオムがあります。

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

バッファを強制的にゼロにします。

しかし、私が考えるより良い代替手段は、-uフラグを使用してバッファリングされていない状態で基本の python プロセスを開始することです。Supervisord.conf ファイル内では、単純に次のようになります。

command=python -u script.py

参照: http://docs.python.org/2/using/cmdline.html#envvar-PYTHONUNBUFFERED

また、これによりログ ファイルが汚れることにも注意してください。特に、ANSI カラーリングで ipdb のようなものを使用している場合はなおさらです。しかし、これは開発環境であるため、これが問題になることはほとんどありません。

これが問題である場合 - 別の解決策は、supervisorctl でデバッグするプロセスを停止し、デバッグのために別のターミナルで一時的にプロセスを実行することです。これにより、必要に応じてログファイルがクリーンに保たれます。

于 2013-03-17T13:10:45.377 に答える
0

Web サーバーが独自の stdout を (内部的に) ログ ファイルにリダイレクトし (つまり、supervisord の stdout リダイレクトを無視する)、supervisord が stdout の行き先を制御できない可能性があります。

これに該当するかどうかを確認するにはtail -f、ログを取得して、ターミナルに表示されるはずの出力がそこに表示されるかどうかを確認します。

その場合は、それを行わないように Web サーバーを構成する方法を見つけることができるかどうかを確認してください。または、他のすべてが失敗した場合は、2 つの端末で作業してみてください... (1 つは入力用、もう 1 つは出力用)。

于 2013-03-16T21:27:43.097 に答える