Upstart不能停止关机时的foreverjs服务吗?

脚本

我们使用运行Ubuntu 12.04 LTS的基于Vagrant的虚拟机来开发三个使用foreverjs启动的Node.JS服务器。 我们运行vagrant用户下的服务,并将项目从主机挂载到虚拟机作为共享文件夹。

forever启动一个脚本时,它将在启动后分叉到后台,保持所有正在运行的脚本(每个用户)的中央列表。 对于使用不同名称的脚本,可以通过名称和数字索引来引用它们。

然后使用forever命令pipe理(启动,重新启动,停止等)脚本。

新贵configuration

我已经为每个服务创build了类似的新贵的conf文件:

 description "Control server.js" chdir /vagrant/server start on vagrant-mounted stop on runlevel [016] expect fork pre-start script test -d /vagrant/server end script exec sudo su vagrant -c "/usr/local/bin/forever start server.js" 

问题 – 关机时挂起

一旦vagrant共享文件夹已经挂载,新贵成功启动服务。 但是,closures虚拟机(即vagrant halt直到超时并强制closures虚拟机。

我认为这是因为它不知道如何阻止永远的服务,因为forever只是一个我真正想要停止的服务的接口

我唯一的尝试没有工作(它停止服务,但stream浪汉挂起超时):

 pre-stop script forever stop server.js end script 

节点服务不需要优雅地终止:我会很高兴任何情况下,杀死脚本,但不会导致stream浪汉关机挂起。

此外,删除stop on runlevel似乎没有效果。

首先,你的问题似乎是不正确的叉子跟踪。 为了解决这个问题,我将对你的新贵configuration进行一些调整:

  • 首先,划掉su的用法来改变用户。 su不应该用于守护进程,只有普通用户(它可能会导致pam被触发时出现问题),以及(更为相关的)它会将进程分叉到后台(难以让Upstart跟踪和终止守护进程)。 我们将在新贵的configuration中使用setuid vagrant
  • 接下来的问题是,永远把这个过程分成背景, 并且把它自己背景化。 这让Upstart跟踪了一些随机的pid,可能甚至不再活跃。 解决scheme是使用Upstart的自动重生function。 我将通过下面的例子来演示。

     description "server.js" start on vagrant-mounted stop on runlevel [016] chdir /vagrant/server setuid vagrant respawn respawn limit unlimited exec server.js 

请注意,您不需要检查/ vagrant / server是否是目录,因为upstart会自动创build它,因为chdir节。