在Python Twisted中,twistd命令可以帮助你做一些与运行应用程序相关的事情(例如,将其守护)。如何守护一个node.js服务器,使其即使在当前会话关闭后也能运行?
twistd
vyswwuz21#
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();
vwkv1x7d2#
如果你需要你的进程守护自己,而不是永远依赖-你可以使用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]"); }
提醒你一下,这是一个相当低级的方法。
flseospp3#
要启动systemd服务管理器守护进程,请编写一个服务文件。例如,创建一个文件/etc/systemd/system/myservice.service。
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
请确保安装server.js(或者您执行的任何主文件),或者考虑通过在服务文件的ExecStart=属性中提供完整的绝对路径来添加您要使用的node可执行文件。
ExecStart=
node
#!/usr/bin/env node // here is the content of the file "server.js" ...
记住在每次更改myservice.service文件后更新服务管理器守护进程。
$ systemctl daemon-reload
然后启动服务运行并使服务在 Boot 时启动。
$ systemctl start myservice $ systemctl enable myservice
g6baxovj4#
UPDATE:i已更新以包括pm2的最新内容:
对于许多使用案例,使用systemd服务是管理节点进程最简单、最合适的方法。对于在单个环境中运行多个节点进程或独立运行节点微服务的使用案例,pm2是功能更全面的工具。https://github.com/unitech/pm2http://pm2.io
pm2 monit
pm2 list
pm2 logs
lb3vh1jj5#
最简单的方法就是将命令发送到后台。
$ node server.js &
然后您可以在稍后的时间杀死进程。我通常会执行以下操作:
$ killall node
注:我运行的是OS X。
mcvgt66p6#
您可以尝试:
$ nohup node server.js &
它在Mac和Linux上对我都有效。输出将位于./nohup.out文件中但我仍然建议您使用pm2或forever,因为它们很容易用于重新启动、停止和日志记录。
./nohup.out
pm2
forever
dffbzjpn7#
还有更高级的通用转轮,如monit和runit。
monit
runit
vjrehmav8#
要了解在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如果你想要一些可移植的(跨平台),其他帖子提供的解决方案可能就足够了。
uttx8gqw9#
有一个更好的解决方案,也是最流行的解决方案之一,它被称为pm2(npm package link)。要运行一个或多个Node.js服务器,您需要安装它:npm install pm2 -g要运行:pm2 start app.js停止:pm2 stop nameOfAppFromList您还可以列出您正在运行的应用程序pm2 list要检查特定日志,请运行pm2 logs nameOfAppFromList
Node.js
npm install pm2 -g
pm2 start app.js
pm2 stop nameOfAppFromList
pm2 logs nameOfAppFromList
9条答案
按热度按时间vyswwuz21#
Forever是您问题答案
安装
用法
从命令行使用Forever
使用来自Node.js的Forever示例
vwkv1x7d2#
如果你需要你的进程守护自己,而不是永远依赖-你可以使用daemonize模块。
然后编写服务器文件,如下所示:
提醒你一下,这是一个相当低级的方法。
flseospp3#
要启动
systemd
服务管理器守护进程,请编写一个服务文件。例如,创建一个文件/etc/systemd/system/myservice.service
。请确保安装server.js(或者您执行的任何主文件),或者考虑通过在服务文件的
ExecStart=
属性中提供完整的绝对路径来添加您要使用的node
可执行文件。记住在每次更改myservice.service文件后更新服务管理器守护进程。
然后启动服务运行并使服务在 Boot 时启动。
g6baxovj4#
UPDATE:i已更新以包括pm2的最新内容:
对于许多使用案例,使用systemd服务是管理节点进程最简单、最合适的方法。对于在单个环境中运行多个节点进程或独立运行节点微服务的使用案例,pm2是功能更全面的工具。
https://github.com/unitech/pm2
http://pm2.io
pm2 monit
命令行监视多个进程或使用pm2 list
监视进程列表pm2 logs
lb3vh1jj5#
最简单的方法就是将命令发送到后台。
然后您可以在稍后的时间杀死进程。我通常会执行以下操作:
注:我运行的是OS X。
mcvgt66p6#
您可以尝试:
它在Mac和Linux上对我都有效。
输出将位于
./nohup.out
文件中但我仍然建议您使用
pm2
或forever
,因为它们很容易用于重新启动、停止和日志记录。dffbzjpn7#
还有更高级的通用转轮,如
monit
和runit
。vjrehmav8#
要了解在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
如果你想要一些可移植的(跨平台),其他帖子提供的解决方案可能就足够了。
uttx8gqw9#
2022 -可吸入颗粒物2
有一个更好的解决方案,也是最流行的解决方案之一,它被称为
pm2
(npm package link)。要运行一个或多个
Node.js
服务器,您需要安装它:npm install pm2 -g
要运行:
pm2 start app.js
停止:
pm2 stop nameOfAppFromList
您还可以列出您正在运行的应用程序
pm2 list
要检查特定日志,请运行
pm2 logs nameOfAppFromList