Bashスクリプトのプロセスが完了するのを待ちます。

Bashスクリプトのプロセスが完了するのを待ちます。

Bashスクリプトで実行されているアクティブなプロセスの数を確認しようとしています。アイデアは、xプロセスを実行し続け、1つのプロセスが完了すると、次のプロセスが開始されることです。

テスト目的で次のスクリプトを設定しました。

find $HOME/Downloads -name "dummy" &
find $HOME/Downloads -name "dummy" &
find $HOME/Downloads -name "dummy" &

while true
do
    pids=()
    while read pid; do
        echo "PID: $pid"
        pids+=("$pid")
    done < <(jobs -p)
    
    jobs -p

    echo "Active processes: ${#pids[@]}"
    if [ ${#pids[@]} -lt 2 ]; then
        break
    fi

    echo "Process(es) still running... ${pids[@]}"
    sleep 1
done

jobs -pただし、プロセスが完了した後もジョブIDが返され続けるため、機能しません。

次の例では、問題について詳しく説明します。

#!/bin/bash

find $HOME/Downloads -name "dummy" &
find $HOME/Downloads -name "dummy" &
find $HOME/Downloads -name "dummy" &

while true
do
    jobs -p # continues to print all 3 jobs
    sleep 1
done

whileループでアクティブなタスクを取得するには?

挨拶、

ベストアンサー1

(@icarusのコメントに従って)この特別なケースでは機能しますが、最後に開始されたプロセスのPIDが含まれているwait -nことに注意してください。$!したがって、これをテストすることもできます。

#!/bin/bash

find $HOME/Downloads -name "dummy" &
p1=$!
find $HOME/Downloads -name "dummy" &
p2=$!
find $HOME/Downloads -name "dummy" &
p3=$!
while true
do
    if ps $p1 > /dev/null ; then
        echo -n "p1 runs "
    else 
        echo -n "p1 ended"
    fi
    if ps $p2 > /dev/null ; then
        echo -n "p2 runs "
    else 
        echo -n "p2 ended"
    fi
    if ps $p1 > /dev/null ; then
        echo -n "p3 runs "
    else 
        echo -n "p3 ended"
    fi
    echo ''
    sleep 1
done

しかし、parallelそれもより良い選択です。

おすすめ記事