1

以下のスクリプトは、デーモン化され、さまざまなユーザーによって数千回ではないにしても数百回トリガーされます。

このスクリプトはinotifywait、アップロード用のフォルダーを監視し、アップロードされたファイルを、以前のアップロードをローテーション (バックアップ/移動) した後、プレゼンテーション用の最終的な宛先に移動するために使用します。コードは、その場で作成されるさまざまなアップロード フォルダーに対して実行されます。

#!/bin/bash

db="$VAR1"/path/to/upload/folder/
s3="$VAR2"/path/to/remote/folder

inotifywait -m -r -e attrib "$db" |
while read dir ev file;
do

        for dirnum in $(cd "$s3"; ls */*.png | sed 's%/.*%%' | sort -nr)
        do
                 next=$(($dirnum + 1));                       
                 mv "$s3/$dirnum/post$dirnum.png" "$s3/$next/post$next.png";
        done

        mv "$db"/"$file"  "$s3"/1/post1.png

done

最適化するにはどうすればよいですか?それとも、より高速なプログラミング言語に書き直す必要がありますか? また、一定の負荷の下でスクリプトをテストするにはどうすればよいですか?

4

3 に答える 3

1

これは同じ動作にはなりませんが、ソートを回避します:

#!/bin/bash

db="$VAR1"/path/to/upload/folder/
s3="$VAR2"/path/to/remote/folder

inotifywait -m -r -e attrib "$db" |
while read dir ev file;
do
    dirnum=1
    while test -e "$s3/$dirnum"; do : $(( dirnum += 1 )); done
    while test $dirnum -gt 0; do
        next=$(( dirnum + 1 ));    
        mkdir -p $s3/$next                   
        mv "$s3/$dirnum/post$dirnum.png" "$s3/$next/post$next.png"
        : $(( dirnum -= 1 ))
    done
    mv "$db/$file" "$s3"/1/post1.png
done

に格納されている最大数を追跡すると$s3、最初のループを回避できます。他のプロセスが でファイルを作成している場合、そうすることは少し脆弱です$s3が、その場合、この単純なソリューションでも競合状態が発生します。ファイルの名前を変更せずに、最初にアップロードしたファイルを に、次のファイルを に入れる方がはるかに簡単 $s3/1です$s3/2。その場合、スクリプトは次のように記述できます。

#!/bin/bash

db="$VAR1"/path/to/upload/folder/
s3="$VAR2"/path/to/remote/folder
dirnum=1
while test -e "$s3/$dirnum"; do : $(( dirnum += 1 )); done
inotifywait -m -r -e attrib "$db" |
while read dir ev file;
do
    mkdir -p "$s3"/$dirnum
    mv "$db/$file" "$s3"/$dirnum/post$dirnum.png
    : $(( dirnum += 1 ))
done
于 2012-10-30T04:48:15.533 に答える
1

新しいファイルを新しいディレクトリに置き、古いファイルを古いディレクトリだけに残すことにより、多くのファイルを移動することを避ける必要があります。post1.png毎回ではなく、最新のファイル (最大数) が表示されるように、プレゼンテーション ロジックを逆にする必要がある場合があります。しかし、あなたはそれをより少なくすることによってそれをスピードアップします - そしてあなたはそれがすでに十分にあるものを放っておくことによってそれをより少なくします.

何かが十分に高速でない場合、それを高速化する最善の方法の 1 つは、一歩下がってアルゴリズムを調べ、使用できる根本的に高速なアルゴリズムがあるかどうかを確認することです。最適なアルゴリズムを既に使用している場合は、それを高速化する方法の詳細を調べますが、アルゴリズムを再検討することで桁違いの改善が得られる場合があり、微調整によって速度が 2 倍になるだけです。

于 2012-10-30T05:50:08.723 に答える
0

次のようにスクリプトをリファクタリングできます。

!/bin/bash

db="$VAR1"/path/to/upload/folder/
s3="$VAR2"/path/to/remote/folder

while read dir ev file
do
   while read dirnum
   do
      next=$(($dirnum + 1))
      mv "$s3/$dirnum/post$dirnum.png" "$s3/$next/post$next.png"
   done < <(find "$s3" -depth 2 -name "*.png" -exec dirname {} \; | sort -unr)

  mv "$db"/"$file"  "$s3"/1/post1.png

done < <(inotifywait -m -r -e attrib "$db")
于 2012-10-30T04:10:01.037 に答える