プロセス(target_executable
)を起動してバックグラウンドで実行しようとしています。次の方法で行うことができますが、私は./target_executable &
ショーを実行しているbashスクリプト内でプロセスの出力を読み、特定の出力を探したいと思います。その後、出力が.foundの場合、ターゲットプロセスがバックグラウンドで実行されている間にスクリプトが完了したいと思います。
これまでに行ったことはこれですが、問題がたくさんあります(バックグラウンドでプロセスを実行せずにIDを見つけても「読み取り完了」に達しません)。
echo "Starting Process..."
TARGET_ID=""
./target_executable | while read -r line || [[ "$TARGET_ID" == "" ]] ; do
TARGET_ID=$(echo "$line" | grep -oE 'Id = [0-9A-Z]+' | grep -oE '[0-9A-Z]{10,}')
if [ "$TARGET_ID" != "" ]
then
echo "Processing $line '$TARGET_ID'"
fi
done
echo "Finished Reading..."
どんなアイデアがありますか?
答え1
これは職業のようですcoproc
。ヘルプから:
coproc: coproc [NAME] command [redirections]
Create a coprocess named NAME.
Execute COMMAND asynchronously, with the standard output and standard
input of the command connected via a pipe to file descriptors assigned
to indices 0 and 1 of an array variable NAME in the executing shell.
The default NAME is "COPROC".
だからそれは次のようになります:
echo "Starting Process..."
TARGET_ID=""
coproc (trap '' PIPE; ./target_executable < /dev/null & disown) # since it's in the bg, input won't be useful
while read -r line || [[ "$TARGET_ID" == "" ]] ; do
TARGET_ID=$(echo "$line" | grep -oE 'Id = [0-9A-Z]+' | grep -oE '[0-9A-Z]{10,}')
if [ "$TARGET_ID" != "" ]
then
echo "Processing $line '$TARGET_ID'"
break
fi
done <&${COPROC[0]} # redirect in from coprocess output
Bashは補助プロセスの入出力用のパイプを設定するため、アプリケーションは切断された出力パイプを処理できる必要があります。すべてのコマンドが使用できるわけではありません。 (だからSIGPIPE
サブシェルに閉じ込められています。)