1

私はスクリプトを書くのが初めてです。圧縮して別の場所にコピーするディレクトリが 21 個あります。4 つのプロセスを並行して実行し、1 つのプロセスが完了したら別のプロセスを開始します。同様に、21 個のディレクトリが完成するはずです。

次の投稿からいくつかのアイデアを得ました。 実行中のプロセスをチェックするbashスクリプト

実行中のサービスの数が 4 未満の場合は、これを追加して別のプロセスを開始する必要があります。

この件に関して私を助けてください。

私のスクリプトは次のとおりです。ここでは、ping コマンドを使用してプロセスをテストしました。これが機能している場合は、コマンドをコピーするように手配できます。

ジョブ.sh

#!/bin/bash

cat my.txt |while read line
do
 run_count=`ps eax | grep ping | grep -v grep | wc -l`
 if [ 4 -gt ${run_count} ]
 then
  /home/cms.sh $line &
 fi
done

cms.sh

#!/bin/bash
value=$1
cmd=ping
host=yahoo.com

$cmd -c $1 $host >> log-$1.txt

my.txt

100
250
150
174
182
140
320
139
150
120
110 
99
156
180
230
132
123
119
156
149
162

これを実行すると、my.txt の最初の 4 行を使用して 4 つのプロセスの実行が開始されます。最初の 4 つのプロセスが終了すると、my.txt に値が残ることはありません。

どこを間違えたのか教えてください。

前もって感謝します!!!

4

5 に答える 5

2

スクリプト作成は初めてなので、 を見てくださいxargs -P。プロセスを並行して実行していない場合でも、慣れる価値のあるコマンドでありparallel、マットが指摘した回答で言及されているよりも、システムに事前にインストールされている可能性がやや高くなります。

于 2012-07-03T07:34:46.030 に答える
1

この種の目的のためのpbzip2並列 bzip2 圧縮があります。また、7z にはマルチスレッド オプションがありますが、試したことはありません。

私は通常、この種のセットアップを使用します。

tar -cp somedir_tobackup/ | pbzip2 | mbuffer -m 180M | netcat <host> <port>

明らかに、代わりに cpio を使用したり、mbuffer を削除したり、最初にローカルのアーカイブ ファイルに保存したり、rsync を使用したりすることができますが、アイデアはそこにあります。

于 2012-07-04T23:13:44.983 に答える
-1

クアッドコア、つまり4つのプロセスがあると思います。間違った解決策。代わりに、コアの数を数えます (この方法では、プロセス変数を手動で変更することなく、デュアル コア、クアッド コア、6 コアなどに拡張できます)。この例は、bash を並列に実行する上で私ができる最善の方法です。取得したコア数でタスクを分割し、取得したコア数でクローンscript.cfgを作成し、それらをバックグラウンドで実行することで作成されます。このようにして、各コアはそれらのフォルダーの一部のみを圧縮します。

フォルダを作成してみましょうbash。その中に、他の 2 つのフォルダー (backupdirectory) を作成します。それらの 21 個のフォルダーを の中に入れますdirectory。2 つのファイルを作成します (.shファイルを実行可能にします)。

start.sh

#!/bin/bash
date=$(date '+%d_%B_%Y')
mkdir backup/$date
cores=$(ls  /proc/acpi/processor/ | wc -l)
cd directory
ls > ../list.result
cd ..
file_lines=$(cat list.result | wc -l)
let "split_lines=$file_lines/$cores"
let "split_lines=$split_lines+1"
split -d --lines=$split_lines list.result CPU
for script in `seq 1 $cores`
do
    let sufix=script-1
    cat script.cfg > "CPU0$sufix.script"
    chmod +x CPU0$sufix.script
    sed -i 's/filenumber/CPU0'$sufix'/g' CPU0$sufix.script
    ./CPU0$sufix.script &
done
exit

およびscript.cfg

#!/bin/bash
date=$(date '+%d_%B_%Y')
lenght=$(cat filenumber |wc -l)
counter=1
for x in `seq 1 $lenght`
do
    value="directory/"$(sed "${x}!d" filenumber)
    tar -zcvf $value.tar.gz $value
    mv directory/*.tar.gz backup/$date
done
rm *.script CPU* list.result
exit

フォルダー内のすべてのファイルはdirectory、CPU のすべてのコアを使用して圧縮され、バックアップ フォルダーに移動されます。この手法はすべてのコアを 100% で実行するため、CPU 温度に注意してください。

于 2012-07-04T22:41:17.313 に答える