由于这篇文章在过去几年里受到了很多关注,所以我在文章的底部列出了每个平台的最佳解决方案。


原来的帖子:

我希望我的node.js服务器在后台运行,即:当我关闭我的终端时,我希望我的服务器继续运行。我在谷歌上搜索过这个,并提出了这个教程,但它并不像预期的那样工作。因此,我没有使用这个守护进程脚本,我认为我只是使用了输出重定向(2>&1 >>文件部分),但这也不退出-我在终端中得到一个空行,就像它在等待输出/错误一样。

我也尝试过把进程放在后台,但是只要我关闭终端,进程就会被杀死。

那么,当我关闭本地计算机时,如何让它继续运行呢?


高级解决方案:

Systemd (Linux) Launchd (Mac) node-windows (Windows) PM2 (node . js)


当前回答

2016年更新: node-windows/mac/linux系列使用跨所有操作系统的通用API,因此它绝对是一个相关的解决方案。然而;Node-linux会生成systemv init文件。随着systemd越来越受欢迎,它实际上是Linux上更好的选择。如果有人想为node-linux添加systemd支持,欢迎PR:-)

原始线程:

这是一个非常老的线程,但是node-windows提供了另一种在Windows上创建后台服务的方法。它松散地基于在节点脚本周围使用exe包装器的nssm概念。然而;它使用winsw.exe代替,并提供了一个可配置的节点包装器,用于更细粒度地控制进程在失败时如何启动/停止。这些进程像其他服务一样可用:

该模块还烘焙了一些事件日志:

对脚本进行后台管理是通过代码完成的。例如:

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\my\\node\\script.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

// Listen for the "start" event and let us know when the
// process has actually started working.
svc.on('start',function(){
  console.log(svc.name+' started!\nVisit http://127.0.0.1:3000 to see it in action.');
});

// Install the script as a service.
svc.install();

该模块支持限制重启(这样糟糕的脚本就不会影响服务器)和增加重启之间的时间间隔。

由于节点窗口服务像其他服务一样运行,因此可以使用您已经使用的任何软件来管理/监视服务。

最后,没有make依赖项。换句话说,简单的npm install -g node-window就可以了。你不需要Visual Studio、. net或node-gyp魔法来安装它。而且,它是MIT和BSD授权的。

坦白地说,我是这个模块的作者。它的设计是为了减轻OP所经历的痛苦,但与操作系统已经提供的功能更紧密地集成。我希望未来有同样问题的观众会觉得有用。

其他回答

有人注意到“2>&1”的位置有一个小错误吗?

2>&1 >> file

应该是

>> file 2>&1

Node.js作为WINDOWS XP的后台服务

Hacksparrow在http://www.hacksparrow.com/install-node-js-and-npm-on-windows.html上提供了在windows下安装Node.js + npm的教程。 为了nnsm.exe的实现,荣誉归于Tatham Oddie: http://blog.tatham.oddie.com.au/2011/03/16/node-js-on-windows/。

安装:

Install WGET http://gnuwin32.sourceforge.net/packages/wget.htm via installer executable Install GIT http://code.google.com/p/msysgit/downloads/list via installer executable Install NSSM http://nssm.cc/download/?page=download via copying nnsm.exe into %windir%/system32 folder Create c:\node\helloworld.js // http://howtonode.org/hello-node var http = require('http'); var server = http.createServer(function (request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.end("Hello World\n"); }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); Open command console and type the following (setx only if Resource Kit is installed) C:\node> set path=%PATH%;%CD% C:\node> setx path "%PATH%" C:\node> set NODE_PATH="C:\Program Files\nodejs\node_modules" C:\node> git config --system http.sslcainfo /bin/curl-ca-bundle.crt C:\node> git clone --recursive git://github.com/isaacs/npm.git C:\node> cd npm C:\node\npm> node cli.js install npm -gf C:\node> cd .. C:\node> nssm.exe install node-helloworld "C:\Program Files\nodejs\node.exe" c:\node\helloworld.js C:\node> net start node-helloworld A nifty batch goodie is to create c:\node\ServiceMe.cmd @echo off nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1 net start node-%~n1 pause

服务管理:

服务本身现在可以通过Start-> Run->访问 服务。msc或通过Start->运行-> MSCONFIG-> Services(并检查“隐藏” 所有微软服务)。 该脚本将为通过批处理脚本生成的每个节点加上前缀 “节点——”。 同样,它们可以在注册表中找到:"HKLM\SYSTEM\CurrentControlSet\Services\node-xxxx"

对于使用更新版本的守护进程npm模块的人,你需要传递文件描述符而不是字符串:

var fs = require('fs');
var stdoutFd = fs.openSync('output.log', 'a');
var stderrFd = fs.openSync('errors.log', 'a');
require('daemon')({
    stdout: stdoutFd, 
    stderr: stderrFd
});

如果您只是想不间断地运行脚本,直到它完成,您可以使用nohup,就像这里的答案中提到的那样。但是,没有一个答案提供一个完整的命令来记录stdin和stdout。

nohup node index.js >> app.log 2>&1 &

>>表示追加到app.log。 2>&1确保错误也被发送到标准输出并添加到app.log中。 结束&确保您当前的终端与命令断开连接,以便您可以继续工作。

如果你想运行一个节点服务器(或者在服务器重新启动时重新启动),你应该使用systemd / systemctl。

公认的答案可能是最好的生产答案,但作为一个快速开发工作的hack,我发现了这个:

Nodejs的scriptname.js &没有工作,因为Nodejs似乎吞噬了&,所以在没有scriptname.js死亡的情况下,它不让我继续使用终端。

但是我把nodejs的scriptname.js放在。sh文件中,然后 Nohup sh startscriptname.sh &工作。

绝对不是一个生产的东西,但它解决了“我需要继续使用我的终端,不想启动5个不同的终端”的问题。