3

我使用工头在生产服务器(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 发送任何事件,但也许有一种我不知道的方法?

提前感谢您的帮助!

4

2 回答 2

1

也许你应该让 redis 由 foreman 启动,这样你就可以更好地控制应用程序的所有依赖项。

或者确保工头比 redis 开始晚得多(确保 /etc/rc2.d 中的工头链接在 S20* 之后列出。

另一种选择:让 redis 服务器也由 upstart 启动,这可能有助于 upstart 管理依赖项。

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

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

于 2013-02-25T10:00:56.590 回答
0

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

如何让新贵工作等待 init.d 脚本?

正如 OP 在问题中所说,启动 init.d 脚本时可能会发出一个新贵事件。这样,新贵的工作可以有一个简单的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

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

你可以在一个新贵的工作中等待几个事件。有关如何找出可用事件的信息,请参阅此问题(老实说,我还没有找到更好的文档)。

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

于 2017-02-16T22:08:56.143 回答