我使用foreman在生产服务器(ubuntu服务器12)上运行我的node.js应用程序。 Foreman有一个很好的工具来为新贵创建脚本。
问题在于,当我重新启动服务器时,我的应用程序(由工头管理)在redis-server之前启动,我要构建一些技巧以等待有效的连接。
理想的解决方案是先启动redis-server,然后在所有启动时启动节点应用程序。
引导配置:
我的问题是:您如何更改节点应用程序的启动顺序? 我想在我的应用程序启动之前等待redis-server,但是当我这样做时,它不会启动:
start on (started redis-server)
我想这是因为没有事件从init.d脚本发送到upstart,但也许有一种我不知道的方式?
先谢谢你的帮助!
答案 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
的技巧似乎非常有用。