在“script”命令中包含时,停止nodejs服务不会终止节点进程

时间:2014-03-01 00:20:10

标签: linux node.js bash init

我在Windows XP 32位主机上的VirtualBox中运行turnkey-node(Debian Wheezy)设备。

在Debian中,我做了一些修改,以便它运行我自己的NodeJS应用程序,而不是默认的。

我还修改了示例run.sh脚本,以便运行script命令而不是直接运行node,然后运行node以便我可以将其输出记录到文件和特技节点,认为它正在使用TTY,以便在日志输出中保留颜色转义序列,如hereherehere所述。

这一切都很有效,除非是时候关闭nodejs服务 - scriptshnode进程都会在服务停止后继续存在。

为什么会发生这种情况?我猜测包含nodejs init script并不打算像这样使用,但我不知道改变它来解决这个问题的第一件事。

以下是我提到的更改:

  • 修改后的/etc/default/nodejs指向我自己的应用run.sh
  • 修改后的run.sh所以看起来像这样:

    #!/bin/sh
    
    cd `dirname $0`
    script -qfc "node server.js" server.log
    

为了让nodejs使用VirtualBox共享文件夹功能,还进行了一些小的修改,但我认为这是不重要的。

1 个答案:

答案 0 :(得分:1)

在您的脚本之前添加exec

当你在脚本中说“foo”时,脚本会分离一个孩子并运行它,然后当它退出时,shell继续执行下一个命令。所以你的“init”看到“shell”就像它的孩子一样,而节点就是孙子。

如果你说exec script -qfc "node server.js" server.log,那么你告诉shell不要分叉孩子,而是直接执行命令并且永远不会返回。这样,您的init脚本将看到节点作为它的子节点,并直接发送节点信号。