【问题标题】:Bash while loop - break and exit (DIE script DIE!!!)Bash while 循环 - 中断并退出(DIE 脚本 DIE !!!)
【发布时间】:2015-03-03 14:49:53
【问题描述】:

我想要从这个脚本中 ssh 到主机,并检查进程是否处于活动状态,如果不是,我希望 littel 脚本死掉。 虽然不会死。它停止,然后在 ssh 再次成功时再次启动。 虽然我想要死亡。

#!/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

【问题讨论】:

  • 使用 pgrep 代替 ps -ef | grep ...。这是一种按名称搜索进程的更直接的方法(注意有用的选项,例如您可能想要或需要的 -u 和 -f)。如果找不到进程,它将返回失败代码。
  • rc=$? 应该在ssh 之后的行...

标签: bash while-loop exit break


【解决方案1】:

您在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2018-05-31
    • 2018-03-16
    • 2012-07-13
    相关资源
    最近更新 更多