如何启动一个node.js服务器作为守护进程?
在Python Twisted中,有一个twistd
命令可以帮助你处理与运行应用程序有关的许多事情(例如守护进程)。
你如何守护一个node.js服务器,以便它可以在当前会话closures后运行?
谢谢你的帮助
永远是回答你的问题。
安装
$ 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();
如果你需要你的进程守护进程,而不是永远继续 – 你可以使用守护进程模块。
$ 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]"); }
请注意,这是相当低级的方法。
更新 :我更新,包括最新从pm2:
对于许多使用情况,使用systemd服务是pipe理节点进程的最简单和最合适的方式。 对于在单一环境中运行多个节点进程或独立运行的节点微服务的用户,pm2是一个function更全面的工具。
https://github.com/unitech/pm2
- 它有一个非常有用的监视function – >漂亮的'gui'命令行监视多个进程与
pm2 monit
或进程列表与pm2 list
- 有组织的日志pipe理 – >
pm2 logs
- 其他的东西:
- 行为configuration
- 源地图支持
- PaaS兼容
- 观看和重新加载
- 模块系统
- 最大内存重新加载
- 集群模式
- 热重新加载
- 开发工作stream程
- 启动脚本
- 自动完成
- 部署工作stream程
- Keymetrics监测
- API
最简单的方法就是将命令发送到后台。
$ node server.js &
然后你可以在稍后的时间杀死这个进程。 我通常会做以下事情:
$ killall node
注意 :我正在运行OS X.
你可以试试:
$ nohup node server.js &
它适用于Mac和Linux上的我。
输出将在./nohup.out
文件中
但我仍然build议您使用pm2
或forever
,因为它们很容易用于重新启动,停止和logging。
要使用systemd启动一个服务,写一个systemd服务文件/etc/systemd/system/myservice.service
[Unit] Description=myservice-description After=network.target [Service] ExecStart=/opt/myservice-location/src/node/server.js 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
然后运行
$ systemctl start myservice
还有更先进的通用跑步者,比如runit
和runit
。
对于在POSIX系统上正常进行守护进程的背景,您可以searchC方法。
我在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
如果你想要一些可移植的(跨平台),其他职位提供的解决scheme可能就足够了。