twistd
命令来帮助您处理与运行应用程序相关的多个问题(例如将其守护化)。如何使node.js服务器守护运行,以便即使在当前会话关闭后也能继续运行?
twistd
命令来帮助您处理与运行应用程序相关的多个问题(例如将其守护化)。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();
server.js
在重启后继续运行,你需要将forever start server.js
添加到启动脚本中(例如rc.local
)。 - UpTheCreek翻译后:如果你需要让进程自我守护化,而不是依赖于 forever,你可以使用 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]");
}
注意,这是一种相当低级的方法。
daemon.on('stopped', () => {
daemon.start();
});
daemon.stop();
break;```
- davidhq要启动一个systemd
服务管理器守护进程,需要编写一个服务文件。例如,创建一个名为/etc/systemd/system/myservice.service
的文件。
如果你的server.js
脚本在第一行使用了shebang(#!/usr/bin/env node
),并且系统可以在路径中找到node
,那么这样就可以工作:
[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
或者,如果您没有在文件中添加shebang,请考虑将要使用的node
可执行文件的绝对路径添加到服务文件的ExecStart=
属性之前。
...
ExecStart=/root/.nvm/versions/node/v16.15.1/bin/node ...
...
每次更改myservice.service文件后,记得更新服务管理器守护进程。
$ systemctl daemon-reload
然后启动服务并启用服务在开机时自动启动。
$ systemctl start myservice
$ systemctl enable myservice
更新:我更新了内容,包括最新的pm2信息:
对于许多用例,使用systemd服务是管理node进程的最简单和最合适的方式。对于在单个环境中运行多个node进程或独立运行的node微服务的情况,pm2是一个更全面的工具。
https://github.com/unitech/pm2
pm2 monit
命令行监视多个进程的漂亮“GUI”,或者使用 pm2 list
查看进程列表pm2 logs
- 行为配置
- 源地图支持
- PaaS兼容
- 观察和重新加载
- 模块系统
- 最大内存重载
- 集群模式
- 热重载
- 开发工作流程
- 启动脚本
- 自动完成
- 部署工作流程
- Keymetrics 监控
- API
最简单的方法就是将命令发送到后台。
$ node server.js &
然后你可以在以后的某个时间杀死该进程。我通常做以下操作:
$ killall node
注意:我正在运行OS X操作系统。
/dev/null
应该包含在完整解决方案中? - nurettin你可以尝试:
$ nohup node server.js &
在我的 Mac 和 Linux 上可以工作。
输出将会在 ./nohup.out
文件中。
但我仍然建议您使用 pm2
或者 forever
,因为它们可以轻松地用于重启、停止和记录日志。
还有一些更高级的通用运行程序,例如 monit
和 runit
。
有一个更好的、最受欢迎的解决方案,它被称为pm2
(npm包链接)。
要运行一个或多个Node.js
服务器,您需要安装它:npm install pm2 -g
运行:pm2 start app.js
停止:pm2 stop nameOfAppFromList
您也可以列出正在运行的应用程序 pm2 list
要检查特定应用程序的日志,请运行pm2 logs nameOfAppFromList
如果想了解在 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
如果你想要一些可移植的东西(跨平台),其他帖子提供的解决方案可能已经足够了。