2

我在 WinXP 上运行 Cygwin。我编写了以下 shell 脚本来将文件从网络驱动器复制到远程服务器...

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

尝试一次复制一个文件。这样,失败的副本不会杀死脚本和其他副本。循环执行此操作...

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 回答
0

您使用的脚本是从网络驱动器进行 scp 复制。当源文件(scp 只是复制)或目标变得不可用时,可能网络问题导致整个脚本停止。
在进行此类传输之前,最好的方法是首先将文件复制到本地缓冲区,必要时检查它们,将它们归档到一个文件中,然后将它们发送到已经在所需目录结构中的目标服务器。通过这种方式,您可以更好地了解哪些方面或哪一方失败了。

到目前为止,这种传输脚本的 scriptng 最佳实践。

只专注于小片段, scp 行 - 一个复制命令正是这一行:

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 个这样的命令,如果一个挂起,其他行没有机会继续。因此,在您的算法中,以下方式会更好:

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 回答
-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.pdfscp是一个相当简单的工具,但如果您尝试复制的源根本不存在,则会引发错误。我“可能”在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 回答