我正在Windows XP 32位主机上的VirtualBox中运行一个交钥匙节点(Debian Wheezy)设备。
在Debian guest中,我做了一些修改,使其运行我自己的NodeJS应用程序,而不是默认的应用程序。
我还修改了示例run.sh
脚本,使其不直接运行node
,而是运行script
命令,该命令反过来运行node
,这样我就可以将其输出记录到文件中,并诱使节点认为它使用了TTY,以便在日志输出中保留颜色转义序列,如这里、这里和这里所讨论的。
这一切都很好,除非是在关闭nodejs服务的时候——服务停止后,script
、sh
和node
进程都会继续运行。
你知道为什么会这样吗?我猜附带的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信号。