do 循环的 Bash 脚本,用于检测经过的时间段然后继续
Posted
技术标签:
【中文标题】do 循环的 Bash 脚本,用于检测经过的时间段然后继续【英文标题】:Bash script for do loop that detects a time period elapsed and then continues 【发布时间】:2017-03-31 22:18:01 【问题描述】:我有一个脚本,它通过一系列服务器运行以连接并由 SCP 抓取要存储的文件
偶尔由于各种原因其中一台服务器崩溃,我的脚本在继续浏览列表之前卡住了大约 4 小时。
我希望能够检测到连接问题或脚本启动后经过的一段时间,然后终止该命令并继续下一步。
我怀疑这会涉及等待或睡眠并继续,但我是循环和 bash 的新手
#!/bin/bash
#
# Generate a list of backups to grab
df|grep backups|awk -F/ ' print $NF '>/tmp/backuplistsmb
# Get each backup in turn
for BACKUP in `cat /tmp/backuplistsmb`
do
cd /srv/backups/$BACKUP
scp -o StrictHostKeyChecking=no $BACKUP:* .
sleep 3h
done
上述脚本运行良好,但如果出现连接问题,它会卡住 4 小时。值得注意的是,有些转移需要 10 分钟,有些需要 2.5 小时
任何想法或帮助将不胜感激
【问题讨论】:
notefor B in
cat file; do...
不太推荐。最好说while read B; do ... done < file
。
scp -o ConnectTimeout=30 ...
?
正在考虑类似的事情:if GETSSTUCK # then continue # 跳过此特定循环迭代的其余部分。完成了
How to setup SSH timeout in shell script的可能重复
scp -o ConnectTimeout=30 - 真的那么简单,如果是的话,它会scip到下一个
【参考方案1】:
尝试为此使用超时程序:
用法:
timeout [OPTION] DURATION COMMAND [ARG]...
例如time (timeout 3 sleep 5)
将运行 3 秒。
所以在你的代码中你可以使用:
timeout 300 scp -o StrictHostKeyChecking=no $BACKUP:* .
这会将复制时间限制为 5 分钟。
【讨论】:
回顾 cmets 我认为 connectionTimeout 是我需要的,因为备份所需的时间从 5 分钟到 3 小时不等 - 谢谢 当然可以。我不知道那个选项。以上是关于do 循环的 Bash 脚本,用于检测经过的时间段然后继续的主要内容,如果未能解决你的问题,请参考以下文章