AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 472955
Accepted
fadedbee
fadedbee
Asked: 2013-01-29 01:18:11 +0800 CST2013-01-29 01:18:11 +0800 CST 2013-01-29 01:18:11 +0800 CST

如何让暴发户退缩,而不是放弃

  • 772

我希望 Upstart 做两件事:

  1. 停止尝试如此快速地重生失败的进程
  2. 永不放弃尝试重生

在理想情况下,暴发户会在 1 秒后尝试重新启动死进程,然后每次尝试都将延迟加倍,直到达到一个小时。

这样的事情可能吗?

ubuntu
  • 6 6 个回答
  • 10800 Views

6 个回答

  • Voted
  1. Best Answer
    Roger Dueck
    2014-01-23T10:55:11+08:002014-01-23T10:55:11+08:00

    Upstart Cookbook 建议停止后延迟 ( http://upstart.ubuntu.com/cookbook/#delay-respawn-of-a-job )。使用respawn不带参数的节,它将永远继续尝试:

    respawn
    post-stop exec sleep 5
    

    (我从这个 Ask Ubuntu question得到这个)

    要添加指数延迟部分,我会尝试在停止后脚本中使用环境变量,我想是这样的:

    env SLEEP_TIME=1
    post-stop script
        sleep $SLEEP_TIME
        NEW_SLEEP_TIME=`expr 2 \* $SLEEP_TIME`
        if [ $NEW_SLEEP_TIME -ge 60 ]; then
            NEW_SLEEP_TIME=60
        fi
        initctl set-env SLEEP_TIME=$NEW_SLEEP_TIME
    end script
    

    ** 编辑 **

    要仅在重生时应用延迟,避免真正停止时的延迟,请使用以下命令,检查当前目标是否为“停止”:

    env SLEEP_TIME=1
    post-stop script
        goal=`initctl status $UPSTART_JOB | awk '{print $2}' | cut -d '/' -f 1`
        if [ $goal != "stop" ]; then
            sleep $SLEEP_TIME
            NEW_SLEEP_TIME=`expr 2 \* $SLEEP_TIME`
            if [ $NEW_SLEEP_TIME -ge 60 ]; then
                NEW_SLEEP_TIME=60
            fi
            initctl set-env SLEEP_TIME=$NEW_SLEEP_TIME
        fi
    end script
    
    • 29
  2. pingles
    2014-10-18T06:21:55+08:002014-10-18T06:21:55+08:00

    如前所述,用于respawn触发重生。

    然而,Upstart Cookbook 的报道respawn-limit称您需要指定respawn limit unlimited连续重试行为。

    默认情况下,只要进程在 5 秒内重生不超过 10 次,它就会重试。

    因此,我建议:

    respawn
    respawn limit unlimited
    post-stop <script to back-off or constant delay>
    
    • 5
  3. fadedbee
    2013-10-22T00:11:05+08:002013-10-22T00:11:05+08:00

    我最终把一个start放在一个cronjob中。如果该服务正在运行,则它没有任何影响。如果它没有运行,它会启动服务。

    • 4
  4. José F. Romaniello
    2016-10-18T11:32:48+08:002016-10-18T11:32:48+08:00

    我对罗杰的回答做了改进。通常,当底层软件出现问题导致其在短时间内大量崩溃时,您希望退避,但一旦系统恢复,您希望重置退避时间。在 Roger 的版本中,服务将始终休眠 60 秒,即使对于 7 次崩溃后的单个和孤立的崩溃也是如此。

    #The initial delay.
    env INITIAL_SLEEP_TIME=1
    
    #The current delay.
    env CURRENT_SLEEP_TIME=1
    
    #The maximum delay
    env MAX_SLEEP_TIME=60
    
    #The unix timestamp of the last crash.
    env LAST_CRASH=0
    
    #The number of seconds without any crash 
    #to consider the service healthy and reset the backoff.
    env HEALTHY_TRESHOLD=180
    
    post-stop script
      exec >> /var/log/auth0.log 2>&1
      echo "`date`: stopped $UPSTART_JOB"
      goal=`initctl status $UPSTART_JOB | awk '{print $2}' | cut -d '/' -f 1`
      if [ $goal != "stop" ]; then
        CRASH_TIMESTAMP=$(date +%s)
    
        if [ $LAST_CRASH -ne 0 ]; then
          SECS_SINCE_LAST_CRASH=`expr $CRASH_TIMESTAMP - $LAST_CRASH`
          if [ $SECS_SINCE_LAST_CRASH -ge $HEALTHY_TRESHOLD ]; then
            echo "resetting backoff"
            CURRENT_SLEEP_TIME=$INITIAL_SLEEP_TIME
          fi
        fi
    
        echo "backoff for $CURRENT_SLEEP_TIME"
        sleep $CURRENT_SLEEP_TIME
    
        NEW_SLEEP_TIME=`expr 2 \* $CURRENT_SLEEP_TIME`
        if [ $NEW_SLEEP_TIME -ge $MAX_SLEEP_TIME ]; then
          NEW_SLEEP_TIME=$MAX_SLEEP_TIME
        fi
    
        initctl set-env CURRENT_SLEEP_TIME=$NEW_SLEEP_TIME
        initctl set-env LAST_CRASH=$CRASH_TIMESTAMP
      fi
    end script
    
    • 3
  5. the-wabbit
    2013-01-29T01:53:24+08:002013-01-29T01:53:24+08:00

    您想要respawn limit <times> <period>- 虽然这不会提供您正在寻找的指数行为,但它可能适用于大多数用例。您可能会尝试使用非常大的值times来period近似您尝试实现的目标。请参阅man 5 init的部分以respawn limit供参考。

    • 1
  6. Whitham Reeve
    2016-04-22T11:26:18+08:002016-04-22T11:26:18+08:00

    其他人已经回答了 respawn 和 respawn limit 节的问题,但我想为控制重新启动之间的延迟的停止后脚本添加我自己的解决方案。

    Roger Dueck提出的解决方案最大的问题是延迟导致'restart jobName'挂起,直到sleep完成。

    在确定是否休眠之前,我的添加检查是否正在进行重新启动。

    respawn
    respawn limit unlimited
    
    post-stop script
        goal=`initctl status $UPSTART_JOB | awk '{print $2}' | cut -d '/' -f 1`
        if [[ $goal != "stop" ]]; then
                if ! ps aux | grep [r]estart | grep $UPSTART_JOB; then
                        sleep 60
                fi
        fi
    end script
    
    • 0

相关问题

  • 无法通过 Ubuntu VPN 访问外部网络

  • ubuntu apt-get upgrade - 如何在 shell 中单击确定?

  • VirtualBox 上 Ubuntu 的访客优化技巧 [关闭]

  • 外部硬盘上的 virtualbox 虚拟硬盘驱动器(Vista 主机上的 ubuntu 客户机)

  • 如何在 Ubuntu 上挂载 LVM 分区?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve