如何在控制台关闭时永远运行node.js应用程序?

Pon*_*ono 53 node.js

我通过ssh连接到我的远程服务器.然后我用Forever启动我的node.js应用程序.一切正常,直到我关闭我的控制台窗口.即使我通过ssh关闭连接,如何在我的远程服务器上运行node.js app FOREVER?我只是想启动一个应用程序并关闭我的copmputer.我的应用程序应该在远程服务器的后台运行.

小智 57

您可能还想考虑使用upstart实用程序.它将允许您像服务一样启动,停止和重新启动节点应用程序.Upstart可以配置为在崩溃时自动重启您的应用程序.

安装新贵:

sudo apt-get install upstart
Run Code Online (Sandbox Code Playgroud)

为您的应用程序创建一个简单的脚本,如下所示:

#!upstart
description "my app"

start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

env NODE_ENV=production

exec node /somepath/myapp/app.js >> /var/log/myapp.log 2>&1
Run Code Online (Sandbox Code Playgroud)

然后将脚本文件(myapp.conf)复制到/ etc/init并确保将其标记为可执行文件.然后可以使用以下命令管理您的应用程序:

sudo start myapp
sudo stop myapp
sudo restart myapp
Run Code Online (Sandbox Code Playgroud)

  • 使用[systemd]更好(https://www.axllent.org/docs/view/nodejs-service-with-systemd/) (4认同)
  • “确保其标记为可执行文件”`chmod + x myapp.conf` (2认同)

T.J*_*der 29

两个答案:一个用于Windows,一个用于*nix:

在Windows上,您可以使用该start命令启动与以下实例断开连接的进程cmd.exe:

start node example.js
Run Code Online (Sandbox Code Playgroud)

在*nix上,有两个方面:断开进程与控制台的连接,并确保它不接收HUP信号("挂断"),大多数进程(包括Node)将通过终止来响应.前者可能是可选的,但后者是必要的.

从控制台断开连接非常简单:通常,您只需&在命令行末尾放置一个&符号():

# Keep reading, don't just grab this and use it
node example.js &
Run Code Online (Sandbox Code Playgroud)

上述内容并未保护过程免受HUP信号影响.HUP关闭shell(控制台)时,程序可能会或可能不会接收,具体取决于所调用的shell选项huponexit.如果huponexittrue,则进程将HUP在shell退出时收到,并且可能会终止.

huponexit默认false使用我使用的各种Linux变体,实际上我很乐意使用上面的内容多年,直到coderjoe和其他人帮助我理解(在一个很长的评论流中,可能已被删除的答案)我依赖在huponexit存在false.

为了避免huponexit可能存在true于您的环境中,请明确使用nohup.nohup运行过程免受HUP信号的影响.你这样使用它:

nohup node example.js > /dev/null &
Run Code Online (Sandbox Code Playgroud)

要么

nohup node example.js > your-desired-filename-or-stream-here &
Run Code Online (Sandbox Code Playgroud)

重定向很重要; 如果你不这样做,你会得到一个最终nohup.out包含从输出文件stdoutstderr.(默认情况下,nohup重定向stderrstdout,如果stdout输出到终端,它会将其重定向到nohup.out.如果从终端接收,nohup也会重定向stdin,因此我们不必这样做.请参阅man nohupinfo coreutils 'nohup invocation'了解详细信息.)

通常对于这些事情,您希望使用进程监视器,以便在进程因某种原因崩溃时,监视器会重新启动它,但上述操作适用于简单的情况.


tqu*_*ang 19

总是,简单是最好的,不需要暴发户,不需要永远,只是nohup:

nohup node file.js &

相信我,我正在为我的情况而奔跑!

  • 编写一个简单的脚本来检查应用程序的日志,当它崩溃时:kill并重新启动nohup (2认同)

jam*_*phy 12

我肯定会推荐pm2
npm install -g pm2

启动服务器:pm2 start [yourServerFile.js]
停止服务器:pm2 stop [yourServerFile.js]

关闭客户端和服务器将永远运行....如果应用程序崩溃,也将重新启动.
我已经在Ubuntu上运行节点服务器几个月没有问题


小智 8

您可以像这样使用npm永久安装:

  sudo npm install -g forever
Run Code Online (Sandbox Code Playgroud)

或作为服务:

 forever start server.js
Run Code Online (Sandbox Code Playgroud)

或停止服务

forever stop server.js
Run Code Online (Sandbox Code Playgroud)

列出所有正在运行的进程:

forever list
Run Code Online (Sandbox Code Playgroud)