メインスクリプトでサブスクリプトを実行しようとしていますが、超えないようにしたいと思います。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以降でのみ利用可能です。