ディレクトリからすべてのスクリプトを実行したい。お気に入り 、
ディレクトリには 40 のスクリプトが含まれています。最初の 5 つのスクリプトを並行して実行したいと思います。これらのスクリプトが完了すると、次の 5 つのスクリプトが残りのスクリプトと同様に実行されます。
Linuxとperlコマンドを使用して解決策を教えてください
最初の 5 つのスクリプトにnohupを使用できますか? 5 番目のスクリプトで、完了したファイルに書き込みを行い、先に進みます。
GNU Make を忘れないでください! このようなメイクファイルを使用し、-j オプションを付けて実行します。http://www.gnu.org/software/make/manual/make.html#Parallelを参照してください
scripts=$(wildcard *.sh)
all: $(patsubst %.sh,%.out,$(scripts))
%.out: %.sh
sh $< > $@ 2>&1
Perl で作業している場合は、Parallel::ForkManagerをお勧めします
ああ、Linux の xargs には、ジョブを並行して実行するための -P オプションがあるようです。私のGNU Makeトリックはそれより前にあるので、私はそれを使用していません。
スクリプトのあるフォルダーにいる場合は、次の bash スクリプト/コマンドを実行します。
for var in $(ls *.pl)
do
$var &
# 5 simultaneous jobs
while test "$(jobs |wc -l)" -gt 4
do
sleep 1
done
done
これは、他のバックグラウンド ジョブが実行されていないことに依存します。コマンドラインで「ジョブ」を記述してテストします。
You can write sth like below. It's pseudo code.
#!/bin/ksh
dir=$1
count=0
for script in $1/*
do
count++
$i &
add the pid to pidList array
if( count==5){
while(waitforProcessComplete(pidList){
}
}
done
私はGNUパラレルを好むでしょう。それは簡単で楽しいものです。ドキュメントには多くの素晴らしい例が含まれています。
大きな利点: スクリプトを実行するためにコードや Makefile を記述する必要はありません。例:
# create the example scripts:
mkdir scripts
for i in {1..50}; do {echo '#!/bin/sh'; echo "echo $i"; echo "sleep 1" } > scripts/s$i.sh; done
# use parallel to run all these scripts, 5 at a time:
parallel -j 5 ::: scripts/*.sh