我需要一些帮助来尝试找出我们遇到的问题。我们在两个独立的网络(network1和network2)上的设备中运行了以下bash shell脚本。两个网络都转到同一目标服务器。
while
do
# do something ...
scp *.zip "$username@$server_ip:$destination_directory"
# do something ...
sleep 30
done
该脚本运行正常,直到最近更改为network2,其中上面脚本中的scp命令有时会在重置之前挂起数小时。 netowrk1上的相同脚本仍然正常工作,但没有改变。我们无法确定network2的问题,除scp外,一切似乎都有效。挂起并不是每次尝试都会发生,但是当它挂起时会挂起几个小时。
所以我改变了scp命令,如下所示,它现在在几分钟内重置,数据延迟是可以忍受的,但不可取。
scp -o BatchMode=yes -o ServerAliveCountMax=3 -o ServerAliveInterval=10 -o \
ConnectTimeout=60 *.zip "$username@$server_ip:$destination_directory"
我也试过sftp如下;
sftp -o ConnectTimeout=60 -b "batchfiles.txt" "$username@$server_ip"
ConnectTimeout似乎在sftp中运行不佳,因为它有时会挂起几个小时。所以我回到使用scp。
我甚至在scp和sftp中都包含了-o IdentityFile = path_to_key / id_rsa选项,认为它可能是一个身份验证问题。这也不起作用。
真正奇怪的是,当我从终端发出相同的命令时它始终有效。 shell脚本作为后台任务运行。我正在运行Linux 3.8.0-26-通用#38-Ubuntu和OpenSSH_6.1p1 Debian-4。我不认为是本地脚本权限问题,因为; 1)它在network2改变之前工作,2)它在某些时候工作。
我做了网络数据包捕获。我可以看到,每次scp命令挂起时,都会在scp会话开始后的几秒钟内伴随[TCP Retransmission]和[RST,ACK]。
我很困惑,如果问题是网络或脚本相关。根据我想到的事件顺序,可能是由于最近网络2的变化。但是为什么每次我尝试时终端都会使用相同的命令?
有人可以告诉我我的问题是什么,或者告诉我如何解决问题?
感谢您阅读和帮助。