2013-02-25 109 views
3

我使用foreman在生产服务器上运行我的node.js应用程序(Ubuntu服务器12)。 工头有一个很棒的工具来为暴发户创建脚本。Upstart和init.d的优先级

的问题是,当我重新启动服务器,我的应用程序(由工头管理)之前的Redis服务器的推出,我已经建立了一些技巧,以等待一个有效的连接。

理想的解决方案将是启动的Redis服务器的前面,和母鸡的节点应用,当一切都开始了。

引导配置:

  • Redis的服务器被/etc/init.d/redis-server推出,是/etc/rc2.d/S20redis-server
  • 我节点应用程序开始/etc/init/stocks-streamer*.conf文件

我的问题是:你将如何改变我的节点应用程序的启动顺序? 我想在我的应用程序开始等待Redis的服务器,但是当我这样做,它不会启动:

start on (started redis-server) 

我想,那是因为没有事件是从的init.d脚本到暴发户,但也许发有一种方法我不知道?

感谢您的帮助!

回答

1

也许你应该Redis的被工头,而不是开始,这样你就可以更好地控制您的应用程序的所有依赖。

,或者确保工头开始远远晚于Redis的(确保工头在/etc/rc2.d中的链接比S20上市以后*

一个比较另类:已Redis的服务器也被新贵开始,这。很可能将帮助新贵管理依赖

有关于如何做到这一点下面的解释是:https://gist.github.com/bdotdub/714533

我建议使用“开始必须先另一个服务”,而不是(http://upstart.ubuntu.com/cookbook/#start-must-precede-another-service),这样的Redis被启动时你开始你自己的服务

+0

问题是我没有在/etc/rc2.d中的新贵脚本的痕迹。 暴发户使用事件来启动和停止脚本。 我想我必须从redis-server脚本发出一个事件,但我不知道该怎么做。 – 2013-02-25 15:04:46

+0

我已经更新了我的答案,建议使用upstart来运行redis。如果新贵管理所有的依赖关系,这应该让'开始'按预期工作。 – 2013-02-25 19:23:24

0

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

如何在init.d脚本上等待一个暴发户的工作?

由于OP在问题中说,init.d脚本启动时可能发出upstart事件。这样,新贵的工作可以有一个简单的start on started SCRIPT_NAME声明。

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

换句话说,该/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的窍门似乎非常有用。