Назад | Перейти на главную страницу

Запускайте команду, пока она не перестанет давать сбои

Я хочу запустить команду, пока она не завершится успешно, а затем остановиться. Я знаю, что могу настроить для этого цикл bash, но мне любопытно, есть ли какие-либо переносимые способы сделать это, подобные watch -n5 это сделает то, что я ищу.

Пример использования: я пытаюсь подключиться через SSH к серверу, который, возможно, еще не работает.

# xxx.xxx.xxx.xxx = ipaddr ssh host
until [ `nmap --open -p 22 xxx.xxx.xxx.xxx |grep -c "ssh"` -eq 1 ]
do 
sleep 4
done 

# ssh stuff here

Просто оберните указанный цикл bash в скрипт, используя $1 чтобы указать фактическую команду, которая должна быть выполнена и $2 для произвольного значения сна. Сделав это, вы сможете запустить такую ​​команду:

$ reallyrunit "ls" 5

Я не знаю, что для этого есть встроенный, но использовать bash примерно так:

RET=1;until [[ $RET = 0 ]];do echo "$(date): About to make an attempt to connect"; ssh 192.168.33.12; RET="$?";sleep 1;done

РЕДАКТИРОВАТЬ: добавлена ​​дата и комментарий, чтобы вы могли отслеживать, как долго он не работает.

Я бы структурировал это в цикле bash. Я полагаю, вы также можете опросить систему (ping, nmap или иначе), чтобы определить состояние службы и подключиться в случае успеха.

Вы можете установить значение выхода на ненулевое значение и затем повторять цикл до тех пор, пока команда не вернется с выходом 0 (успех). Вот сценарий, который у меня есть:

#!/bin/sh

cd /exports/home/exports/sl
$(exit 1)


while [ $? != 0 ]; do rsync -avlH --delete  --exclude=6.1/archive --exclude=6.1/i386/archive --exclude=6.1/x86_64/archive --exclude=6.1/i386/iso --exclude=
6.1/x86_64/iso rsync://rsync.gtlib.gatech.edu/scientific/6.1 6.1/; done

Не лучший из скриптов - это был скорее мысленный эксперимент по обеспечению того, чтобы rsync перезапустился в случае сбоя, пока не завершится успешно.

Изменить: в вашем случае вам, вероятно, понадобится что-то вроде:

#!/bin/sh

$(exit 1) ; while [ $? != 0 ]; do sleep 1 ; nc -vvv  -z 192.168.15.37 22  && ssh 192.168.15.37  ; done

Вы можете добавлять условия ошибки здесь и там, но важно немедленно подключиться, как только вы убедитесь, что порт открыт, для чего предназначена операция && - она ​​выполнит следующую команду, если предыдущая команда была успешной. (До этого момента неудачное соединение вернет ненулевой код выхода, что приведет к продолжению цикла). После успешного входа в систему и выхода из нее код выхода, возвращенный из этого успешного сеанса входа в систему, завершит цикл.

(команда сна является необязательной, но обратите внимание, что в некоторых случаях без цикла сна ваш дисплей может замедляться, пока вы не свернете его или не переключитесь на следующее окно, что может быть проблемой, если ваш дисплей является удаленным рабочим столом)