2012-08-09 52 views
2

我在WinXP上運行Cygwin。我寫了下面的shell腳本從網絡驅動器的文件複製到遠程服務器...如何獲得一個shell腳本以在一個複製命令停止後繼續複製文件?

scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*TE* [email protected]:/var/www/html/sbo/2010/teacher/ela/level1 
scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*SE* [email protected]:/var/www/html/sbo/2010/student/ela/level1 
scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*TE* [email protected]:/var/www/html/sbo/2010/teacher/ela/level2 
scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*SE* [email protected]:/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 

有沒有辦法讓腳本繼續複製文件,即使出現此錯誤消息?

+0

你是否考慮使用比scp更適合的東西?例如,rsync爲這種需求做了非常好的工作。 – 2012-08-11 08:30:34

回答

0

嘗試一次複製一個文件。這樣,失敗的副本不會殺死腳本和其他副本。爲此在一個環......

for i in //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*TE* 
do 
    scp -P 9998 "$i" [email protected]:/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" [email protected]:/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" [email protected]:/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" [email protected]:/var/www/html/sbo/2010/teacher/ela/level2 
done 
+0

那麼,這種方式不會允許腳本在惡劣條件下繼續運行,它只會再次失效。 – 2012-08-12 17:12:49

-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命令找不到在direcotry文件cb_sb_ela_miu_L1_U2_activity2_15_SE.pdfscp是一個相當簡單的工具,但如果您嘗試複製的源根本不存在,則會拋出錯誤。我有可能在scp命令到達文件(使用通配符)時移動或刪除文件。此外,建議您使用recursive標誌外卡複印件像

scp -Bpqr //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L1*TE* [email protected]:/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 [email protected]:/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 [email protected]:/var/www/html/sbo/2010/teacher/ela/level2 
    fi 
done 
0

您正在使用的腳本是從網絡驅動器複製scp。當源文件(scp正在複製)或目標變得不可用時,網絡問題可能導致整個腳本停頓。
進行這種傳輸之前的最佳方法是首先將文件複製到本地緩衝區,如有必要檢查它們,將它們歸檔到一個文件,然後將它們發送到已處於理想目錄結構中的目標服務器。 通過這種方式,您可以更好地瞭解哪些方面或哪些方面失敗。

到目前爲止,這樣的轉移腳本的腳本最佳實踐。

只集中到小片段中,SCP線 - 一個副本COMAND正是這條線:

scp -P 9998 //tdggendska10/vig-preview-dmz-prod/docs/sbo/pdf/*ela*L2*TE* \ 
      [email protected]:/var/www/html/sbo/2010/teacher/ela/level2 

您正在使用你的腳本不給機會,其他線路4級這樣的命令,繼續當一個掛起。因此,在你的算法如下方式會更好:

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。

相關問題