【发布时间】:2011-06-21 16:10:15
【问题描述】:
在 Python Twisted 中,您可以使用 twistd 命令帮助您处理与运行应用程序相关的许多事情(例如,对其进行守护)。
您如何守护 node.js 服务器,使其即使在当前会话关闭后也能运行?
【问题讨论】:
标签: node.js
在 Python Twisted 中,您可以使用 twistd 命令帮助您处理与运行应用程序相关的许多事情(例如,对其进行守护)。
您如何守护 node.js 服务器,使其即使在当前会话关闭后也能运行?
【问题讨论】:
标签: node.js
Forever 是对您问题的回答。
$ curl https://npmjs.org/install.sh | sh
$ npm install forever
# Or to install as a terminal command everywhere:
$ npm install -g forever
从命令行使用 Forever
$ forever start server.js
使用 Node.js 中的 Forever 实例
var forever = require('forever');
var child = new forever.Forever('your-filename.js', {
max: 3,
silent: true,
args: []
});
child.on('exit', this.callback);
child.start();
【讨论】:
forever start server.js 添加到启动脚本(例如 rc.local)。
如果您需要您的进程自行守护进程,而不是永远中继 - 您可以使用 daemonize 模块。
$ npm install daemonize2
然后像示例一样编写您的服务器文件:
var daemon = require("daemonize2").setup({
main: "app.js",
name: "sampleapp",
pidfile: "sampleapp.pid"
});
switch (process.argv[2]) {
case "start":
daemon.start();
break;
case "stop":
daemon.stop();
break;
default:
console.log("Usage: [start|stop]");
}
请注意,这是一种相当低级的方法。
【讨论】:
case 'restart': daemon.on('stopped', () => { daemon.start(); }); daemon.stop(); break;
要启动systemd 服务管理器守护程序,请编写服务文件。例如,创建一个文件/etc/systemd/system/myservice.service。
[Unit]
Description=myservice-description
After=network.target
[Service]
ExecStart=/opt/myservice-location/src/node/server.js --args=here
Restart=always
User=me
Group=group
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/opt/myservice-location
[Install]
WantedBy=multi-user.target
记得在每次更改 myservice.service 文件后更新服务管理器守护进程。
$ systemctl daemon-reload
然后启动服务运行,使服务在开机时启动。
$ systemctl start myservice
$ systemctl enable myservice
【讨论】:
更新:我已更新以包含来自 pm2 的最新内容:
对于许多用例,使用 systemd 服务是管理节点进程的最简单和最合适的方式。对于那些在单一环境中运行大量节点进程或独立运行节点微服务的人来说,pm2 是一个功能更全的工具。
https://github.com/unitech/pm2
pm2 monit 或使用pm2 list 对多个进程进行命令行监控
pm2 logs
- 行为配置
- 源地图支持
- PaaS 兼容
- 观看并重新加载
- 模块系统
- 最大内存重新加载
- 集群模式
- 热重载
- 开发工作流程
- 启动脚本
- 自动完成
- 部署工作流
- 关键指标监控
- API
【讨论】:
最简单的方法就是将命令发送到后台。
$ node server.js &
然后您可以稍后终止该进程。我通常会这样做:
$ killall node
注意:我运行的是 OS X。
【讨论】:
/dev/null 应该包含在完整的解决方案中?
你可以试试:
$ nohup node server.js &
它适用于 Mac 和 Linux。
输出将在./nohup.out 文件中
但我仍然建议你使用pm2 或forever,因为它们很容易用于重新启动、停止和记录。
【讨论】:
还有更高级的通用运行器,如monit和runit。
【讨论】:
有关在 POSIX 系统上守护进程的常规方法的背景,您可以搜索 C 方法。
我在 node.js API 中没有看到足够多的方法来允许它以 C 方式手动完成。但是,当使用 child_process 时,您可以让 node.js 为您完成:
http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options
我认为这可能是浪费时间,因为您的系统很有可能提供相同的功能。
例如:
http://libslack.org/daemon/manpages/daemon.1.html
如果您想要一些可移植(跨平台)的东西,其他帖子提供的解决方案可能就足够了。
【讨论】: