由于这篇文章在过去几年里受到了很多关注,所以我在文章的底部列出了每个平台的最佳解决方案。
原来的帖子:
我希望我的node.js服务器在后台运行,即:当我关闭我的终端时,我希望我的服务器继续运行。我在谷歌上搜索过这个,并提出了这个教程,但它并不像预期的那样工作。因此,我没有使用这个守护进程脚本,我认为我只是使用了输出重定向(2>&1 >>文件部分),但这也不退出-我在终端中得到一个空行,就像它在等待输出/错误一样。
我也尝试过把进程放在后台,但是只要我关闭终端,进程就会被杀死。
那么,当我关闭本地计算机时,如何让它继续运行呢?
高级解决方案:
Systemd (Linux)
Launchd (Mac)
node-windows (Windows)
PM2 (node . js)
当我在RHEL 8 AWS EC2实例上使用@mikemaccana的接受答案时,我收到了以下错误:(code=exited, status=216/GROUP)
这是由于使用用户/组设置为:'nobody'。
在谷歌上搜索,似乎使用用户/组作为'nobody'/'nogroup'对守护进程来说是不好的实践,就像在unix堆栈交换中回答的那样。
在我将用户/组设置为我的实际用户和组后,它工作得很好。
您可以输入whoai和组来查看可用的解决此问题的选项。
我的服务文件为mongodb的全堆栈节点应用程序:
[Unit]
Description=myapp
After=mongod.service
[Service]
ExecStart=/home/myusername/apps/myapp/root/build/server/index.js
Restart=always
RestartSec=30
User=myusername
Group=myusername
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/home/myusername/apps/myapp
[Install]
WantedBy=multi-user.target
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所经历的痛苦,但与操作系统已经提供的功能更紧密地集成。我希望未来有同样问题的观众会觉得有用。
如果你正在使用pm2,你可以将autorestart设置为false:
$ pm2生态系统
这将生成一个示例ecosystem.config.js:
module.exports = {
apps: [
{
script: './scripts/companies.js',
autorestart: false,
},
{
script: './scripts/domains.js',
autorestart: false,
},
{
script: './scripts/technologies.js',
autorestart: false,
},
],
}
$ pm2启动ecosystem.config.js