親スクリプトの終了後も維持されるように、プロセスの置き換えによって出力をリダイレクトするプロセスをどのように設定しますか?
プロセスの開始時に出力を監視し、プロセスが正常に続行できるようにプロセスを解放するBashスクリプトを設定しようとしています。 (これを別のスクリプト内で呼び出して起動するまで、追加の実行をブロックしたいと思います。)。
http.server
このモジュールをテストケースとして使用しています。以下のコードはPythonモジュールを正しく起動し、リクエストの出力を確認してGET
終了します。ただし、終了するとプロセスhttp.server
も終了します。 Bashが終了した後もこのプロセスを維持するにはどうすればよいですか?
exec 3< <(python3 -u -m http.server 2>&1 )
while true; do
read -t 2 line
echo "reading..."
echo "$line"
if [[ "$line" =~ .*GET.* ]]; then
break
fi
done <&3
bashが終了するとファイルディスクリプタが閉じられ、3
出力ファイルが閉じているのを見るとPythonが終了するため、プロセスが死んでいると思います。色々なリダイレクトを試してみましたが、3
役に立たなかった。プロセスが生き残るには、プロセスの他の部分を変更する必要がありますか?基本的に私は実行するのと同じですpython3 -u -m http.server 2>&1 &
が、プロセスが最初に起動したときにプロセスの出力を一時的に監視できるようにしたいです。
答え1
Bashスクリプトからサブプロセス(Pythonプログラムの実行)を開始し、ここからBashスクリプトへのパイプを作成します。
Bashスクリプトが終了した後、読み取り用にパイプを開くプロセスはもうありません。したがって、次にPythonスクリプトがパイプに書き込むと、SIGPIPEシグナルを受信して終了します。標準エラーではなく標準出力のみをパイプにリダイレクトすると、結果エラーが表示されます。
PythonスクリプトがSIGPIPEシグナルを無視しても、パイプへの書き込みに失敗して例外が発生するため、パイプへの書き込み時にはまだ終了します。
サーバーが準備されたことを知らせる行だけを見たり、最初の要求に対する行まで見たい場合は、簡単な方法はリーダーを実行状態にすることです。
exec 3< <(python3 -u -m http.server 2>&1 )
{ while true; do
…
done;
exec cat;
} <&3
エラーメッセージを無視する代わりに、標準エラーをログファイルのどこかにリダイレクトできます。
BaseHTTPRequestHandler.log_request
別のアプローチは、最初にログエントリのみをエクスポートするようにメソッドをオーバーライドするPythonの数行を作成することです。