【问题标题】:How to sequence init.d scripts under Ubuntu如何在 Ubuntu 下对 init.d 脚本进行排序
【发布时间】:2010-12-23 14:04:15
【问题描述】:

我有一些服务器和其他守护程序需要以正确的顺序启动。

我已经从骨架脚本创建了 init.d 脚本,并且可以安装它们以使用编号命名系统以正确的顺序启动,但仍然存在一些问题:

一个服务器('serverA')需要初始化一个数据库连接,然后监听一个套接字。 然后另一个服务器('serverB')需要连接到该套接字,如果前面的进程尚未侦听,则连接将失败。有没有办法阻止 serverA 的 init.d 脚本在 serverA 开始监听之前终止?在 serverA init 终止之前,serverB init 不会启动。

现在,设置通过让 serverB 重试连接直到成功,但这种方法似乎很脆弱。我想更确定地了解如何强制排序。

【问题讨论】:

    标签: ubuntu init.d


    【解决方案1】:

    是的,这是我要回答的问题,但我发现这种技术很有用,并且正在与其他遇到类似问题的人分享。

    我发现 socat 在等待套接字或端口时非常有用。一个 init.d 脚本,如:

    case “$1″ in
      start)
      echo '--benign phrase' | socat - UNIX-CONNECT:/path/to/socket,retry=10,intervall=1
    ;;
    

    将等到套接字变为可写,然后返回。不涉及守护进程,因此它会阻止更高编号的 init.d 脚本的执行,直到它完成。

    使用此类服务​​员脚本会减慢启动顺序,因此不是最佳选择,但与在脚本中散布“sleep n”语句的非常脆弱的方法相比,这是一个很大的改进。

    【讨论】:

      【解决方案2】:

      如果服务器侦听域套接字,您可以构建一个轮询套接字的循环。在 bash 中可能有一种更简单的方法来执行此操作,但它可能看起来像:

      for i in 1 2 3 4 5; do
        if [ -e '/var/run/myserver.sock' ]; then
          break
        fi
      done
      

      另一种解决方案是让您的服务器在打开侦听套接字之前不进行守护进程。这样,init 脚本将暂停,直到进程守护进程,从而保证套接字可用。

      当然,这取决于您的应用程序自己执行守护进程,而不是通过其他方式。 ("/usr/bin/myserver &" 之类的。)

      更新:

      还要注意,你现在所做的都是 System-V 风格的 init。 Ubuntu 实际上使用的是 Upstart,它是一个基于事件的系统,而不是一系列脚本。您可以选择使用 upstart 作业而不是 System-V 初始化脚本,并从您的服务器触发一个自定义 Upstart 事件,这将触发您的第二个服务器的启动。

      Getting Started guide 在底部有一个这样的例子。我不知道是否有 API 方式,但这可能只是“system("/bin/initctl emit myevent");”的问题在您的第一台服务器中的正确时间点。具有更多 Upstart 经验的其他人可能能够更好/更深入地阐述。

      【讨论】:

      • 我相信socket'file'一直都在,所以它的存在并不是一个好的指标。延迟的守护进程是有希望的。我现在确实使用 shell '&' 方法(快速简单),但在内部进行守护进程已经足够实用了。
      • 您可以在启动服务器之前删除套接字,因此必须重新创建它。 (我也忘记了,循环可能也需要短暂的睡眠。)
      • 您可能希望在轮询循环中休眠。
      【解决方案3】:

      我不认为它是脆弱的——至少我能想到它不会脆弱的场景。重试时间为 5 秒,一点也不差。这是一种 KISS 方法,没有任何你不理解的极端情况。

      让分布式环境同步并不适合胆小的人,在您的示例中它是多余的。

      为了让你对你的方法有信心,我可以告诉你,我有几十个手写的复杂服务器进程分布在一个网络农场上,即使数据库服务器消失或网络消失,它们也从未让我感到悲伤中继线已关闭等。它们只是继续以降级模式运行,直到数据库恢复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 2011-08-14
        • 1970-01-01
        • 2021-09-01
        • 2022-10-24
        相关资源
        最近更新 更多