2015-01-06 65 views
0

我想從這個腳本中獲得的所有內容都是ssh到主機,並檢查進程是否還活着,如果不是,我想要littel腳本去死。 雖然沒有死。它停止,然後再次啓動ssh,再次成功。 雖然我想要死亡。Bash while循環 - 中斷並退出(DIE腳本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

相反的'ps -ef的| grep ...',使用'pgrep'。這是一種更直接的方式來搜索名稱的進程(注意你可能需要或者需要的'-u'和'-f'等有用的選項)。如果找不到該過程,它將返回失敗代碼。 –

+0

'rc = $?'應該在'ssh'之後的行上... – Jasen

回答

2

您的ssh命令之前設置rc=$?,而且最後一個命令是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