2012-03-23 1 views
3

私は毎分XX時に実行するスクリプトを持っています。スクリプトは、指定されたディレクトリ内のすべてのサブフォルダをループし、内部のファイルに対して操作を実行します。フォルダの原子移動を保証する

folder=/path/to/directory #Starting directory 
someerror=0 #Did we have an error? 

#CD to directory. Does it even exist? 
cd $folder 
RETVAL=$? 
[ $RETVAL -eq 0 ] && echo Success changing directory to $folder && mainfolderexist=1 
[ $RETVAL -ne 0 ] && echo Failure changing directory to $folder && mainfolderexist=0 

if [ $mainfolderexist -eq 1 ]; then 
    shopt -s nullglob 
    for dir in $folder/*/ 
    do 
    thedirname=`basename $dir` #Get directory name 
    #cd to sub dir. Does it even exist? 
    cd $dir 
    RETVAL=$? 
    [ $RETVAL -eq 0 ] && echo Success changing directory to $dir && subfolderexist=1 
    [ $RETVAL -ne 0 ] && echo Failure changing directory to $dir && subfolderexist=0 
    if [ $subfolderexist -eq 1 ]; then 
     #perform some operation on all files in this directory 
     someApp -someArgs --name=$thedirname * 
    else #sub folder doesn't exist 
     someerror=1 
     break 
    fi 

    #next folder 
    done 
else #main folder doesn't exist 
    someerror=1 
fi 

#REPEAT (only if no errors occured) 
if [ $someerror -eq 0 ]; then 
at now + 1 minutes << END 
/bin/bash "$0" "[email protected]" 
END 
fi 

私はこれを使用する方法、私は/home/incomingのようなフォルダに、SFTPを使用してサーバにディレクトリをアップロードして、ディレクトリが完全にアップロードされると、私は/path/to/directoryに移動します。今これは私が心配している部分です。

これまでのところ、私はXX:XX:02とXX:XX:50の間でディレクトリを移動するようにしてきましたが、これも必要ですか?私はシステムの時間を考慮せずにアップロード+移動プロセスを自動化したいと思っています。

  1. ディレクトリが移動中(mv "somedir" "/path/to/directory/somedir")XX:00に移動していて、スクリプトが実行され、すべてのディレクトリをループするとどうなりますか?
  2. mvコマンド実行中にシステムの電源が切れた場合はどうなりますか?ディレクトリが半分に移動した場合などは、上記のスクリプトを実行する前にこれを確認するスクリプトを作成する必要があります。
+0

これは、ディレクトリが「完全にアップロードされた」ときはどのように分かりますか? – larsks

+0

あなたのソースとデスティネーションが同じファイルシステム上にあるかどうか知っていますか?そうでない場合は、部分的にしかコピーされていないディレクトリにアクセスしないように、cronジョブに情報を追加する必要があります。 – ghoti

+0

@larsks私はそうではありません。だからこそ私は今、手動でやっています。私は、サーバーがディレクトリから何を期待しているのかを知り、アップロードを開始し、予想が本当のことと一致したときにディレクトリを移動させるプログラムを書くつもりです。あなたがより良い選択肢を持っていない限り、そういうことですか? – natli

答えて

14

ソースと宛先のパスが同じファイルシステム上にある場合、mvはアトミックな操作です。実際にファイルのコピーやその他のファイルの再配置は必要ないため、ディレクトリは決して「半分移動」状態になることはありません。一方、ソースとデスティネーションパスが異なるファイルシステム上にある場合

は、その後、mvは実際に続くコピー割り込みが発生した場合、かなりの時間を取ることができた、ツリー全体にわたり、削除され物事は半完成状態になります。

+2

残念ながら、ソースとデスティネーションが同じファイルシステム上にない場合、mvに失敗するように指示する方法はないので、正しく設定する必要があります。 –

+1

Linuxと仮定すると、 'mountpoint'コマンドを使って、' mv'を呼び出す前に2つのパスが同じファイルシステムにあるかどうかを調べることができますが、この場合はポイントがないと思われます。おそらく宛先パスは固定です毎回チェックする必要はありません。 – larsks

+0

mvコマンドを実行する前に、ソースディレクトリで 'ls -s >>/home/folder_expectation/$ thedirname_source'を実行するとどうでしょうか。そして、メインスクリプトのすべてのループを実行して、 'ls -s >>/home/folder_expectation/$ thedirname_target'を実行し、' cmp/home/folder_expectation/$ thedirname_source/home/folder_expectation/$ thedirname_target'を実行します。その後、一致しない場合はループを中断します(または現在の項目をスキップします)。これはクロスファイルシステムで動作しますか? – natli

4

mvはアトミック操作です(ディレクトリを移動するとディレクトリの名前を変更するだけで、ディスク上のファイルは移動しません)。 mvは、thisによるsys-call renameをアトミックにします(いくつかの制約の影響を受けます)。 newpathが、すでにそれがアトミックに置き換えられますが存在する場合

- 別のプロセスが欠落しているでしょうnewpathがアクセスしようとした時にはポイントがないように、(数条件の対象とし、以下のエラーを参照してください)。

+1

問題は、名前の変更を使用していない場合です。あなたがまだ周りにいるなら、あなたはあなたの投稿のどこかに言及できますか?もちろん、マークされた答えはすでにそれを言いますが、確かに確かめてください。 – erikbwork

0

同じディスクとパーティションのいずれか(または両方)がソフトウェアとして暗号化を使用している場合でも、動きはアトミックではないことを覚えておいてください。例:同じマシン内の2人のユーザーが/ homeにディレクトリを持っています。そのうちの1つが暗号化されたホームディレクトリを使用している場合、移動を行う前にファイルを暗号化/復号化または復号化/暗号化または暗号化または復号化する必要があるため、移動はアトミックではありません

関連する問題