4

ディレクトリからすべてのスクリプトを実行したい。お気に入り 、

ディレクトリには 40 のスクリプトが含まれています。最初の 5 つのスクリプトを並行して実行したいと思います。これらのスクリプトが完了すると、次の 5 つのスクリプトが残りのスクリプトと同様に実行されます。

Linuxとperlコマンドを使用して解決策を教えてください

4

6 に答える 6

10

誰もが並列実行ツールを再発明するのが大好きです。

于 2012-06-19T10:01:21.557 に答える
2

最初の 5 つのスクリプトにnohupを使用できますか? 5 番目のスクリプトで、完了したファイルに書き込みを行い、先に進みます。

于 2012-06-19T09:52:08.610 に答える
1

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トリックはそれより前にあるので、私はそれを使用していません。

于 2012-06-19T15:12:13.893 に答える
1

スクリプトのあるフォルダーにいる場合は、次の bash スクリプト/コマンドを実行します。

for var in $(ls *.pl)
do
    $var &
    # 5 simultaneous jobs 
    while test "$(jobs |wc -l)" -gt 4 
    do
        sleep 1
    done
done

これは、他のバックグラウンド ジョブが実行されていないことに依存します。コマンドラインで「ジョブ」を記述してテストします。

于 2012-06-19T09:58:52.133 に答える
0
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
于 2012-06-19T10:40:48.760 に答える
0

私は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
于 2012-06-19T19:24:56.743 に答える