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 小时

任何想法或帮助将不胜感激

【问题讨论】:

note for 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 脚本,用于检测经过的时间段然后继续的主要内容,如果未能解决你的问题,请参考以下文章

shell 脚本-for 循环

使用for循环bash脚本逐行读取文件[重复]

12.3bash脚本循环语句

使用shell脚本for循环实现一天倒计时

while 循环

While 循环在 Bash 的第一行之后停止读取