Сценарий Bash для цикла do, который определяет истекший период времени и затем продолжает

У меня есть скрипт, который просматривает список серверов для подключения и захватывает с помощью 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 часа.

Любые идеи или помощь будут очень признательны


person user2786484    schedule 17.11.2016    source источник
comment
примечание for B in cat file; do... не очень рекомендуется. Лучше сказать while read B; do ... done < file.   -  person fedorqui 'SO stop harming'    schedule 17.11.2016
comment
он думал о чем-то вроде: if GETSSTUCK # then continue # Пропустить оставшуюся часть этой конкретной итерации цикла. готово   -  person user2786484    schedule 17.11.2016
comment
Возможный дубликат Как настроить время ожидания SSH в сценарии оболочки   -  person Ruslan Osmanov    schedule 17.11.2016
comment
scp -o ConnectTimeout=30 - действительно так просто, будет ли он переходить к следующему, если это так   -  person user2786484    schedule 17.11.2016
comment
Хорошо, я не думаю, что могу использовать тайм-аут, потому что это зависит от того, как долго работает скрипт.   -  person user2786484    schedule 17.11.2016


Ответы (1)


Попробуйте использовать для этого программу тайм-аута:

Использование:

timeout [OPTION] DURATION COMMAND [ARG]...

Например. time (timeout 3 sleep 5) будет работать в течение 3 секунд. Итак, в вашем коде вы можете использовать:

timeout 300 scp -o StrictHostKeyChecking=no $BACKUP:* .

Это ограничивает копию до 5 минут.

person quantummind    schedule 17.11.2016
comment
Оглядываясь назад на комментарии, я думаю, что connectionTimeout — это то, что мне нужно, поскольку продолжительность резервного копирования сильно варьируется от 5 минут до 3 часов — спасибо. - person user2786484; 17.11.2016
comment
Конечно, вы можете это сделать. Я не знал такого варианта. - person quantummind; 26.04.2020