2015-01-06 6 views
0

Все, что я хочу от этого скрипта, - это ssh для хоста и проверить, жив ли процесс, а если нет, мне нужен сценарий littel умереть. Не умирает. Он останавливается, а затем снова запускается на ssh. Я хочу смерти, хотя.Bash while loop - break and exit (DIE script DIE !!!)

#!/bin/bash 
iterate=0 
while [ $iterate -le 20000 ] 
do 
    rc=$? 
    ssh -q -T coolhost "ps -ef | egrep '[i]cool-process' | grep wrapper " 
    if [[ $rc -eq 0 ]] ; then 
     sleep 2 
     iterate=$((iterate+1)) 
    else 
     break 
     exit 1 
    fi 
done 

Он будет проходить до 2000, однако, если удаленный процесс сломается, он не умрет. Он не сломается и не выйдет.

это будет работать - но не будет спать - если я поставлю сон, rc отправится в 0 и никогда не умрет. , так что это работает, но является слишком простым.

#!/bin/bash 
set -e 
while : ; do 
    ssh -q -T coolhost "ps -ef | egrep '[i]cool-process' | grep wrapper" > /dev/null 2>&1 
done 
+1

Вместо 'пс -ef | grep ... ', используйте' pgrep'. Это гораздо более прямой способ поиска процессов по имени (обратите внимание на полезные опции, такие как '-u' и' -f', которые вам могут понадобиться или нужны). Он вернет код сбоя, если процесс не найден. –

+0

'rc = $?' Должно быть в строке, следующей за 'ssh' ... – Jasen

ответ

2

Вы устанавливаете rc=$? перед командой ssh, и последняя команда была команда test ([), который как раз удалось, поэтому, когда вы испытываете if [[ $rc -eq 0 ]] ответ всегда "да, это делает.

Лучше всего, чтобы проверить статус ssh непосредственно:

#!/bin/bash 
iterate=0 
while [ $iterate -le 20000 ] 
do 
    if ssh -q -T coolhost "ps -ef | egrep '[i]cool-process' | grep wrapper"; then 
     sleep 2 
     ((iterate++)) 
    else 
     break # or exit 1 
    fi 
done 
Смежные вопросы