2

WinXPでCygwinを実行しています。ネットワークドライブからリモートサーバーにファイルをコピーするために、次のシェルスクリプトを作成しました...

scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*TE* dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level1
scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*SE* dalvarado@localhost:/var/www/html/sbo/2010/student/ela/level1
scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*TE* dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level2
scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*SE* dalvarado@localhost:/var/www/html/sbo/2010/student/ela/level2

問題は、このスクリプトを実行すると、次のようなエラー(「そのようなファイルまたはディレクトリはありません」)が発生し、スクリプトが停止することがあることです。

sh copy_files.sh    
...
cb_sb_ela_miu_L1_U2_activity2_12_SE.pdf                                                                                                           100%  771KB  51.4KB/s   00:15
cb_sb_ela_miu_L1_U2_activity2_13_SE.pdf                                                                                                           100%  716KB  55.0KB/s   00:13
cb_sb_ela_miu_L1_U2_activity2_14_SE.pdf                                                                                                           100%  966KB  50.8KB/s   00:19
cb_sb_ela_miu_L1_U2_activity2_15_SE.pdf                                                                                                            71%  640KB  36.9KB/s   00:06 ETA
//tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/cb_sb_ela_miu_L1_U2_activity2_15_SE.pdf: No such file or directory

このエラーメッセージが表示された場合でも、スクリプトにファイルのコピーを続行させる方法はありますか?

4

3 に答える 3

0

使用しているスクリプトは、ネットワーク ドライブからコピーする scp です。おそらくネットワークの問題が原因で、ソース ファイル (scp はコピー中) またはターゲットが利用できなくなったときにスクリプト全体が停止します。
このような転送を行う前の最善の方法は、まずファイルをローカル バッファにコピーし、必要に応じてチェックし、それらを 1 つのファイルにアーカイブしてから、目的のディレクトリ構造にあるターゲット サーバーに送信することです。このようにして、どの側が失敗しているかをよりよく知ることができます。

これまでのところ、このような転送スクリプトのスクリプト作成のベスト プラクティスまでです。

小さな断片だけに集中すると、scp 行 - 1 つのコピー コマンドはまさにこの行です。

scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*TE* \
            dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level2

スクリプトでそのようなコマンドを 4 つ使用しているため、1 つの行がハングした場合に他の行が続行される可能性がありません。したがって、あなたのアルゴリズムでは、次の方法がより良いでしょう:

scp -P 9998 <sourceL1TE> <targetL2TE> &
scp -P 9998 <sourceL2TE> <targetL2TE> &
scp -P 9998 <sourceL1SE> <targetL2TE> &
scp -P 9998 <sourceL2SE> <targetL2TE> &

アンパサンドは各行をバックグラウンドに送信するため、前の行が終了するのを待たずに他の行も開始されます。

次に、バッチモードのように動作するように scp に通知せずに、バッチモードで scp を使用します。次のことを考慮する必要があります。

scp -Bq -P 9998 <sourceL1TE> <targetL2TE> &
scp -Bq -P 9998 <sourceL2TE> <targetL2TE> &
scp -Bq -P 9998 <sourceL1SE> <targetL2TE> &
scp -Bq -P 9998 <sourceL2SE> <targetL2TE> &

これにより、残りのスクリプトを続行できます。

時折 scp が古くなる原因となるいくつかの転送の問題についての知識があれば、タイムアウトオプションを追加することで、古くなった問題をさらに処理できます。接続が長くなりすぎた場合は、scp を停止するのに役立ちます。

scp -Bq -o ConnectTimeout 30 -P 9998 <sourceL1TE> <targetL2TE> &
scp -Bq -o ConnectTimeout 30 -P 9998 <sourceL2TE> <targetL2TE> &
scp -Bq -o ConnectTimeout 30 -P 9998 <sourceL1SE> <targetL2TE> &
scp -Bq -o ConnectTimeout 30 -P 9998 <sourceL2SE> <targetL2TE> &

などなど。

bash スクリプトと scp オプション、およびその他のユーティリティを使用してより適切に実行する方法は多数あります。上記は良いスタートにすぎません。何が失敗したかを追跡し、失敗したソースに対して scp を再起動することを検討することもできます。

于 2012-08-09T15:19:38.173 に答える
0

一度に 1 つのファイルをコピーしてみてください。そうすれば、失敗したコピーによってスクリプトやその他のコピーが強制終了されることはありません。これをループで行う...

for i in //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*TE*
do
    scp -P 9998 "$i" dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level1
done

for i in //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*SE*
do
    scp -P 9998 "$i" dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level1
done

for i in //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*TE*
do
    scp -P 9998 "$i" dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level2
done

for i in //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*SE*
do
    scp -P 9998 "$i" dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level2
done
于 2012-08-09T13:45:52.773 に答える
-1

ログを見る

sh copy_files.sh    
...
cb_sb_ela_miu_L1_U2_activity2_12_SE.pdf                                                                                                           100%  771KB  51.4KB/s   00:15
cb_sb_ela_miu_L1_U2_activity2_13_SE.pdf                                                                                                           100%  716KB  55.0KB/s   00:13
cb_sb_ela_miu_L1_U2_activity2_14_SE.pdf                                                                                                           100%  966KB  50.8KB/s   00:19
cb_sb_ela_miu_L1_U2_activity2_15_SE.pdf                                                                                                            71%  640KB  36.9KB/s   00:06 ETA
//tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/cb_sb_ela_miu_L1_U2_activity2_15_SE.pdf: No such file or directory

scp コマンドがそのディレクトリでファイルを見つけられなかったことは明らかcb_sb_ela_miu_L1_U2_activity2_15_SE.pdfです。scpはかなり単純なツールですが、コピーしようとしているソースがまったく存在しない場合はエラーがスローされます。scpコマンドが (ワイルドカードを使用して) ファイルに到達するまでに、ファイルが移動または削除される可能性があります。また、次recursiveのようなワイルド カード コピーにフラグを使用することをお勧めします。

scp -Bpqr //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*TE* dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level1

以下のように実行する前に、各ファイルのファイル チェックを実行して、ファイルが存在するかどうかを確認することもできますscp。このようにして、転送しようとしているファイルが存在することを常に確信できます。

#copies all level1 files to level1 directory
for file in `ls -1 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*`
do
   if [ -f $file ] then
     scp -Bpq $file dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level1
   fi
done

#copies all level2 files to level2 directory
for file in `ls -1 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*`
do
   if [ -f $file ] then
     scp -Bpq $file dalvarado@localhost:/var/www/html/sbo/2010/teacher/ela/level2
   fi
done
于 2012-08-09T13:51:18.107 に答える