Upstart和init.d优先级

时间:2013-02-25 09:52:55

标签: node.js redis upstart foreman

我使用foreman在生产服务器(ubuntu服务器12)上运行我的node.js应用程序。 Foreman有一个很好的工具来为新贵创建脚本。

问题在于,当我重新启动服务器时,我的应用程序(由工头管理)在redis-server之前启动,我要构建一些技巧以等待有效的连接。

理想的解决方案是先启动redis-server,然后在所有启动时启动节点应用程序。

引导配置:

  • redis-server由/etc/init.d/redis-server启动,是/etc/rc2.d/S20redis-server
  • 我的节点应用程序以/etc/init/stocks-streamer*.conf文件启动

我的问题是:您如何更改节点应用程序的启动顺序? 我想在我的应用程序启动之前等待redis-server,但是当我这样做时,它不会启动:

start on (started redis-server)

我想这是因为没有事件从init.d脚本发送到upstart,但也许有一种我不知道的方式?

先谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

也许你应该让工作人员启动redis,这样你就可以更好地控制应用程序的所有依赖关系。

或者确保工头的开始时间比redis晚得多(确保/etc/rc2.d中的工头链接列于晚于S20 *。

还有一个选择:redis服务器也可以由upstart启动,这可能有助于新手管理依赖项。

这里有关于如何执行此操作的说明:https://gist.github.com/bdotdub/714533

我建议使用“开始必须先于其他服务”(http://upstart.ubuntu.com/cookbook/#start-must-precede-another-service),以便在您开始自己的服务时启动redis。

答案 1 :(得分:0)

由于这个问题没有被接受的答案,并且鉴于我在这里遇到了同样的问题,我想我会提供另一个解决方案。这个问题可以重新说明为:

如何让upstart作业等待init.d脚本?

正如OP在问题中所说,当init.d脚本启动时,可能会发出一个upstart事件。这样,upstart作业可以有一个简单的start on started SCRIPT_NAME声明。

在我的情况下,使用基于CentOS的自定义发行版,我的/etc/rc.d/rc负责执行sysvinit(init.d)脚本。该脚本完全支持upstart,因此为每个启动/停止的sysvinit脚本发出upstart事件。

换句话说,/etc/rc.d/rc脚本有这样的东西(简化为留下多汁的东西):

for i in /etc/rc$runlevel.d/S* ; do
    subsys=${i#/etc/rc$runlevel.d/S??}
    initctl emit --quiet starting JOB=$subsys
    $i start
    initctl emit --quiet started JOB=$subsys
done

我想你需要看看你的脚本,并在你认为合适的地方添加事件发射。就我而言,排放已经存在。

您可以在新手工作中等待多个事件。请参阅this问题,了解如何查找可用的事件(我还没有找到更好的文档)。

特别是grep -r emit的技巧似乎非常有用。