3


ftpサーバーを指定してftpサーバーからファイルを転送するためにbashシェルのシェルスクリプトを作成する必要があります
--fileserver@example.comuseruser1
password pass1

現在、ftpサーバーの/ dir1 / dir2に、次の形式のフォルダーがあります
0.7.1.70
0.7.1.71
0.7.1.72

最新のフォルダ、この場合は0.7.1.72からファイル「file1.iso」をコピーする必要があります。また、コピー中にファイルの整合性を確認する必要があります。つまり、ファイルがサーバーにアップロードされていると仮定します。そのときにコピーを開始すると、コピーは完了しません。

私は4時間ごとにそれをしなければなりません。これは、cronジョブにすることで実行できます。助けてください

私はこれを行いました。ftpサーバーフォルダをローカルマシンにマウントしました。ファイルが完全にアップロードされているかどうかを確認するために、50秒ごとにサイズを5回確認しています。同じ場合はコピーします。それ以外の場合は、4時間後にスクリプトを実行します...テキストファイル「foldernames」を維持しています。必要なファイルをコピーしたすべてのフォルダの名前が付いている.txt"..したがって、foldername.textファイルでその名前を確認することにより、サーバーに新しいフォルダが追加されているかどうかを確認しています.. **

すべてが正常に機能している唯一の問題は..ファイルがダウンロードされていたときにネットワーク障害が発生したと仮定します..ファイルを完全にダウンロードしたことを確認するにはどうすればよいですか....md5sumとchksumを使用しようとしましたしかし、マウントされたフォルダでの計算には時間がかかりました。助けてください

これが私のスクリプトです..

#!/bin/bash
#
# changing the directory to source location 
echo " ########### " >> /tempdir/pvmscript/scriptlog.log
echo `date`>> /tempdir/pvmscript/scriptlog.log
echo " script is strting " >> /tempdir/pvmscript/scriptlog.log
cd /var/mountpt/pvm-vmware
#
# array to hold the name of last five folders of the source location
declare -a arr
i=0
for folder in `ls -1 | tail -5 `; do
arr[i]=$folder
#echo $folder
i=$((i+1))
done
echo " array initialised " >> /tempdir/pvmscript/scriptlog.log
#
#now for these 5 folders we will check if their name is present in the list of copied         
#  folder names
#
echo " checking for the folder name in list " >> /tempdir/pvmscript/scriptlog.log
## $(seq $((i-1)) -1 0 
for j in $(seq $((i-1)) -1 0  ) ; do
var3=${arr[$j]}
#var4=${var3//./}
echo " ----------------------------------------" >>  /tempdir/pvmscript/scriptlog.log
echo " the folder name is $var3" >> /tempdir/pvmscript/scriptlog.log
#
# checking if the folder name is present in the stored list of folder names or not
#
#
foldercheck=$(grep $var3 /tempdir/pvmscript/foldernames.txt | wc -l)
#
if test $foldercheck -eq 1
then 
echo " the folder $var3 is present in the list so will not copy it " >>  /tempdir/pvmscript/scriptlog.log
foldercheck=" "
continue
else
#
echo " folder $var3 is not present in the list so checking if it has the debug.iso file ">> /tempdir/pvmscript/scriptlog.log
#enter inside  the new folder in source
#
cd  /var/mountpt/pvm-vmware/$var3
#
# writing the names of content of folder to a temporary text file
#
ls -1 > /var/temporary.txt
#checking if the debug.iso is present in the given folder
var5=$(grep debug.iso /var/temporary.txt | wc -l)
var6=$(grep debug.iso //var/temporary.txt)
#
check1="true"
#
# if the file is present then checking if it is completely uploaded or not  
#
rm -f /var/temporary.txt
if test $var5 -eq 1 
then 
echo " it has the debug.iso checking if upload is complete   ">>/tempdir/pvmscript/scriptlog.log
#
# getting the size of the file we are checking if size of the file is constant or     changing    # after regular interval
#
var7=$(du -s ./$var6 |cut -f 1 -d '.')
#echo " size of the file is $var7"
sleep 50s
#
# checking for 5 times at a regular interval of 50 sec if size changing or not 
#
#
for x in 1 2 3 4 5 ;do
var8=$(du -s ./$var6 |cut -f 1 -d '.')
#
#if size is changing exit and check it after 4 hrs when the script will rerun
#echo " size of the file $x is $var7"
if test $var7 -ne $var8
then
check1="false"
echo " file is still in the prossess of being uploadig so exiting will check after 4 hr  " >> /tempdir/pvmscript/scriptlog.log
break
fi
sleep 50s
done
#
#if the size was constant copy the file to destination
#
if test $check1 = "true" 
then
echo " upload was complete so copying the debug.iso file  " >>  /tempdir/pvmscript/scriptlog.log
cp $var6 /tempdir/PVM_Builds/ 
echo " writing the folder name to the list of folders which we have copied " >>  /tempdir/pvmscript/scriptlog.log
echo $var3 >> /tempdir/pvmscript/foldernames.txt
echo " copying is complete  " >> /tempdir/pvmscript/scriptlog.log
fi
#else 
#echo $foldercheck >> /vmfs/volumes/Storage1/PVM_Builds/foldernames.txt
else
echo " it do not have the debug.iso file so leaving the directory "  >>/tempdir/pvmscript/scriptlog.log
echo $var3 >> /tempdir/pvmscript/foldernames.txt
echo 
fi
#rm -f /var/temporary.txt
fi
done
4

3 に答える 3

2

ここにいくつかのコメントと明確化の要求があります。考えられる答えの 1 つについては、休憩の下を参照してください。

(あなたの質問を更新する素晴らしい仕事です。)

これらのファイルの大きさは?

これらのファイルは、作成の開始時刻を制御できますか (データベースのバックアップなど)。

また、これらのファイルの詳細、つまりサイズ、MB、GB、TB、PB などをいくつか教えていただけると助かります。およびそれらを作成するソース、db-backup、または ???.

あなたの懸念は、最悪のシナリオに対する理論的で積極的な調査ですか、それとも実際の問題がある場合、どのくらいの頻度で、どのような結果になりますか?

あなたの SLA は非現実的/達成不可能な管理パイプ ドリームですか? もしそうなら、あなたのシステムの欠陥を修正するために現在のシステムが X 量の追加リソース (人、ハードウェア、プログラミングなど) を必要とすることを示す文書の作成を開始する必要があります。


転送されるファイルがソース システムによって作成されたデータ ファイルである場合、1 つの手法は、メイン ファイルの送信後に送信される「フラグ」ファイルをソース システムに作成させることです。

次のような詳細を含めることができます

  filename : TradeData_2012-04-13.dat
  recCount : 777777
  fileSize : 37604730291
  workOfDate: 2012-04-12
  md5sum    : ....

したがって、受信する各ファイルに標準の命名規則を使用し、ファイルに埋め込まれたスタンドの日付スタンプを使用しているため、システムはフラグ ファイルが配信されたことを検出するのを待ちます。ファイルが到着すると、スクリプトは関連する各詳細を計算し、フラグ ファイルに格納されている値と比較します。

このレベルの詳細を調整できない場合は、少なくとも一般的なフラグ ファイル、1 日ごとのファイルごと、またはファイルの毎日のバッチごと (すべてのファイルが完了したときに送信される) に続いて、新しいファイルをセットと比較するテストを行うことができます。特定の状況に適したテストの...次のいくつか:

  • ファイルは少なくともXの大きさでなければなりません
  • ファイルは少なくとも N レコードでなければなりません
  • ファイルは昨日のファイルよりも小さくなることはありません

次に、あなたの防御は、「ファイルを完全に制御することはできませんが、X、Y、Z についてチェックし、それらのテストに合格したため、それらをロードしました」です。


良いかもしれませrsyncんが、言及されたシナリオのいくつかを考えると、ファイルにrsyncデータを追加し始める可能性があるため、ファイルのロードを開始しても安全であると確信できる方法はわかりません。


スクリプトを読んで、ソースから詳細なフラグ ファイルを取得できない場合は、正しい方向に進んでいます。Glenn Jackman のソリューションは、より少ないコードで同じ目標を達成するように見えます。これを scriptFile 'getRemotedata.sh' などの内部に配置し、'getRemotedata.sh' が正常に終了した場合にのみ終了する while ループに配置できます。実行に 3*normalTime が費やされたという何らかの通知が必要だと思います。しかし、すべての条件をカバーしようとすると、非常に複雑になる可能性があります。ファイルのダウンロードを管理できるサードパーティのツールがありますが、それらを購入する予算がなかったため、お勧めできません。

ふぅ

これが役立つことを願っています。


PS StackOverflow へようこそ (SO) FAQ ( http://tinyurl.com/2vycnvr ) を読み、灰色の三角形を使用して良い Q/A に投票して ください ( http://i.imgur.com/kygEP.png )。問題を解決する答えがある場合は、チェックマーク記号を押して受け入れるには、http://i.imgur.com/uqJeW.png

于 2012-04-15T17:37:43.610 に答える
1
#!/bin/sh
if mkdir /tmp/download_in_process 2>/dev/null; then
    echo "cannot start, download in process"
    exit 1
fi

latest=$(ftp hostname << END1 | tail -1
user user1 pass1
cd /dir1/dir2
ls
END1
)

ftp hostname << END2
user user1 pass1
cd /dir1/dir2/$latest
get file1.iso
END2

rmdir /tmp/download_in_process
于 2012-04-11T06:12:22.340 に答える
1

FTP プロトコルは十分に堅牢ではありません。アトミック性は扱わず、ダウンロード中にファイルがまだアップロードされているかどうかを知る方法はありません。この機能が必要な場合rsyncは、ダウンロードとアップロードの両方を使用して調査する必要があります。

于 2012-04-11T04:19:48.423 に答える