停止 nodejs 服务在包装在 "script" 命令中时不会终止节点进程



我正在Windows XP 32位主机上的VirtualBox中运行一个交钥匙节点(Debian Wheezy)设备。

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

我还修改了示例run.sh脚本,使其不直接运行node,而是运行script命令,该命令反过来运行node,这样我就可以将其输出记录到文件中,并诱使节点认为它使用了TTY,以便在日志输出中保留颜色转义序列,如这里、这里和这里所讨论的。

这一切都很好,除非是在关闭nodejs服务的时候——服务停止后,scriptshnode进程都会继续运行。

你知道为什么会这样吗?我猜附带的nodejs init脚本并不是这样使用的,但我不知道如何更改它来解决这个问题。

以下是我提到的变化:

  • 修改了/etc/default/nodejs以指向我自己的应用程序的run.sh
  • 修改了run.sh,使其看起来像这样:

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

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

在脚本前面放一个exec

当你在脚本中只说"foo"时,脚本会派生出一个子脚本并运行它,然后当它退出时,shell会继续执行下一个命令。因此,您的"init"将"shell"视为它的子级,而node则是孙级。

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

相关内容

  • 没有找到相关文章

最新更新