n個以下の並列サブシェルを実行する方法

n個以下の並列サブシェルを実行する方法

メインスクリプトでサブスクリプトを実行しようとしていますが、超えないようにしたいと思います。N添字は同時に実行されます。

次の簡単な例はこれを示しています。

/dev/shm/各添字は、独自のタイムスタンプで構成された名前を使用してRAM()に仮想ファイルを作成し、完了すると削除します。

デフォルトのスクリプトは、添え字で発生したダミーファイルの数を計算し、/dev/shm/2つ以上の添え字がすでに実行されている場合は、新しい添え字を開始しません(開始しないでください)。

しかし、デフォルトのスクリプトはwhile条件を無視し、5つの添え字をすべてすぐに開始するようです。

私のコードに問題がありますか?

メインスクリプト.txt

#!/bin/bash
for counter in $(seq 1 5)
do
        while [ $(ls -1 /dev/shm/|grep "script044"|wc -l) -ge 2 ]
        do
                sleep 0
        done

        xterm -e "bash script044.txt" &
done

exit

script044.txt(下付き文字)

#!/bin/bash

tempfilename="script044_"$(date +%Y%m%d%H%M%S)_${RANDOM}
echo > /dev/shm/${tempfilename}

for counter in $(seq 1 $(shuf -i 10-45 -n 1))
do
        sleep 1
        printf "${counter}\r"
done

rm /dev/shm/${tempfilename}

exit

ベストアンサー1

(慣例 -プレーン.txtテキストファイルです。 .shファイルはシェルスクリプトファイルです。)

mainscript.txt スクリプトに競合状態があります。具体的には、whileループはscript044.txtスクリプトが一時ファイルを生成する前に次の反復を開始します。実際、これらのファイルが生成される前にループ全体が繰り返されます。

この種の作業を処理するより安定した方法は、一時ファイルを忘れて組み込みシェルを使用することですwait

#!/bin/bash

pid_count=0
for counter in $(seq 1 5)
do
    xterm -e "bash script044.txt" &
    if (( ++pid_count > 2 )); then
        wait -n
        ((pid_count--))
    fi
done

子プロセスが開始されるたびにカウンタがインクリメントされます。カウンタが3より大きい場合は、wait次のサブプロセスを完了します。戻ったときにwaitカウンタを減らし、次のxtermを再起動します。

script044.txt からtempfilename関連行をすべて削除できます。もう必要ありません。


@chepnerが指摘したように、必須-nオプションはbash 4.3以降でのみ利用可能です。

おすすめ記事