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
それもより良い選択です。