我有一个简单的脚本,可以从远程服务器中提取数据,因为进程使用 rsync
生成它:
while :
do
rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./
rsync -avz --remove-source-files -e ssh me@remote:path/to/bar* ./
rsync -avz --remove-source-files -e ssh me@remote:path/to/baz* ./
rsync -avz --remove-source-files -e ssh me@remote:path/to/qux* ./
sleep 900 #wait 15 minutes, try again
done
如果没有文件,rsync
返回退出状态12(显然是)。如果上述 rsync
的无找到任何数据,我想从循环中折断(生成数据可能已退出的过程)。为了减轻任何混乱,我做不是是否想从循环中脱颖而出,即使rsync
的1个过程成功。
有没有一种简洁的方法可以在狂欢中做到这一点?
您可以通过添加返回值来做到这一点,因此,如果它们都返回12,则总和为48:
while :
do
rc=0
rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./
let rc+=$?
rsync -avz --remove-source-files -e ssh me@remote:path/to/bar* ./
let rc+=$?
rsync -avz --remove-source-files -e ssh me@remote:path/to/baz* ./
let rc+=$?
rsync -avz --remove-source-files -e ssh me@remote:path/to/qux* ./
let rc+=$?
if [[ $rc == 48 ]]; then # 48 = 4 * 12
break;
fi
sleep 900 #wait 15 minutes, try again
done
请注意,如果您获得了返回代码的另一组合总和为48,即0 0 0 12 36
受其他答案的启发,我认为这是我到目前为止可以做到的最清洁的方法...
while :
do
do_continue=0
rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./ && do_continue=1
rsync -avz --remove-source-files -e ssh me@remote:path/to/bar* ./ && do_continue=1
rsync -avz --remove-source-files -e ssh me@remote:path/to/baz* ./ && do_continue=1
rsync -avz --remove-source-files -e ssh me@remote:path/to/qux* ./ && do_continue=1
if [[ $do_continue == 0 ]]; then
break
fi
sleep 900 #wait 15 minutes, try again
done
可以进行更多重构以删除断裂语句和相关的条件测试:
do_continue=1
while [ do_continue -eq 1 ]; do
do_continue=0
rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./ && do_continue=1
#...
sleep 900
done
这样的方式计算由于没有文件而导致的失败数。
while :
do
nofile=0
rsync -avz --remove-source-files -e ssh me@remote:path/to/foo* ./
(( $? == 12 )) && let nofile++
rsync -avz --remove-source-files -e ssh me@remote:path/to/bar* ./
(( $? == 12 )) && let nofile++
rsync -avz --remove-source-files -e ssh me@remote:path/to/baz* ./
(( $? == 12 )) && let nofile++
rsync -avz --remove-source-files -e ssh me@remote:path/to/qux* ./
(( $? == 12 )) && let nofile++
# if all failed due to "no files", break the loop
if (( $nofile == 4 )); then break; fi
sleep 900 #wait 15 minutes, try again
done