Bash - 出力の読み込み中にバックグラウンドプロセスを実行する

Bash - 出力の読み込み中にバックグラウンドプロセスを実行する

プロセス(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サブシェルに閉じ込められています。)

おすすめ記事