【问题标题】:How to make a node.js application run permanently?如何使 node.js 应用程序永久运行?
【发布时间】:2012-09-23 22:53:49
【问题描述】:

在 Debian 服务器上,我安装了 Node.js。我了解如何使用以下命令行从 putty 启动应用程序:

node /srv/www/MyUserAccount/server/server.js

并通过地址50.51.52.53:8080(IP 和端口)访问它。

但是一旦我关闭 putty,我就无法再访问地址50.51.52.53:8080

如何让 Node.js 应用程序永久运行?

如您所料,我是 Linux 和 Node.js 的初学者。

【问题讨论】:

标签: node.js server


【解决方案1】:

尝试pm2 让您的应用程序永远运行。

npm install -g pm2

然后使用

pm2 start server.js

要列出和停止应用,请使用命令

pm2 list

pm2 stop 0

【讨论】:

  • 谢谢先生。你为社区所做的事情真是太棒了。看起来现在我们可以列出、停止和启动我们有价值的 node.js 应用程序了。不知道,刚学过!谢谢!
【解决方案2】:

forever 包对我有用,只有一件事,它取决于 deep-equal,所以如果您在安装它时遇到问题,例如:

npm -g install forever

试试:

npm -g install forever deep-equal@1.1.1

改为。

【讨论】:

    【解决方案3】:

    另一种方法是为您的应用创建一个系统单元。在“/etc/systemd/system”文件夹中创建一个“XXX.service”文件,类似这样:

    [Unit]
    Description=swagger
    After=network.target
    
    [Service]
    ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
    WorkingDirectory=/home/swagger
    Restart=always
    RestartSec=30
    
    [Install]
    WantedBy=multi-user.target
    

    一个好处是应用程序将作为服务运行,如果它崩溃,它会自动重新启动。

    您也可以使用 sytemctl 来管理它:

    systemctl start XXX 启动服务,systemctl stop XXX 停止服务,systemctl enable XXX 系统启动时自动启动应用程序。

    【讨论】:

      【解决方案4】:

      无需安装任何其他软件包。

      运行这个命令

      node server.js > stdout.txt 2> stderr.txt &
      

      server.js 是您的服务器文件,也可以是 api.js

      然后点击“exit”关闭终端

      exit
      

      【讨论】:

      • 当我从命令末尾删除 & 时它起作用了。但这是一个很好的答案。我想知道这个解决方案是否真的可以被pm2 包取代。
      【解决方案5】:

      先全局安装pm2

      npm install -g pm2
      

      然后开始

      pm2 start bin/www 
      

      【讨论】:

        【解决方案6】:

        希望对你有帮助。

        在命令行,永久安装:

        npm install forever -g
        

        创建一个示例文件:

        sudo nano server.js 
        

        您可以直接在浏览器中编辑文件并获得结果。
        您可以使用 filezilla 或任何编辑器来编辑文件。 运行这个命令来运行文件:

        forever start --minUptime 1 --spinSleepTime 1000 -w server.js
        

        【讨论】:

          【解决方案7】:

          安装

          $ [sudo] npm install forever -g
          

          您可以使用 forever 连续运行脚本

          forever start server.js
          
          forever list
          

          停止服务

          forever stop server.js
          

          【讨论】:

            【解决方案8】:

            Forever 是一个非常好的 NodeJs 模块,可以做到这一点。

            在命令行输入安装forever

            $ npm install forever -g
            

            然后使用下面的命令运行一个node.js脚本

            $ forever start /path/to/script.js
            

            你可以走了。此外,您可以运行

            $ forever list
            

            查看所有正在运行的脚本。您可以通过键入终止任何特定脚本

            $ forever stop [pid]
            

            其中[pid] 是您将从list 命令获得的脚本的进程ID。要停止所有脚本,您可以键入

            $ forever stopall
            

            【讨论】:

              【解决方案9】:

              虽然其他答案解决了 OP 的问题,但它们都是矫枉过正,并没有解释他或她遇到此问题的原因。

              关键是这一行,“我关闭putty,然后我无法到达地址”

              当您在 Putty 上登录远程主机时,您已经启动了一个 SSH linux 进程,并且从该 SSH 会话键入的所有命令都将作为所述进程的子进程执行。

              您的问题是,当您关闭 Putty 时,您正在退出 SSH 会话,这会杀死该进程和任何活动的子进程。当您关闭 putty 时,您会无意中杀死您的服务器,因为您是在 前台 中运行它的。为了避免这种行为,通过将 & 附加到您的命令,在 background 中运行服务器:

              node /srv/www/MyUserAccount/server/server.js &
              

              这里的问题是缺乏 linux 知识,而不是关于 node.js 的问题。如需更多信息,请查看:http://linuxconfig.org/understanding-foreground-and-background-linux-processes

              更新:

              正如其他人所提到的,节点服务器在退出终端时可能仍然会死机。我遇到的一个常见问题是,即使节点进程在 bg 中运行,它的标准输出和标准错误仍然指向终端。这意味着如果节点服务器写入 console.log 或 console.error 它将收到一个损坏的管道错误并崩溃。这可以通过管道处理流程的输出来避免:

              node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &
              

              如果问题仍然存在,那么您应该研究诸如 tmuxnohup 之类的东西,它们仍然比特定于节点的解决方案更强大,因为它们可用于运行所有进程类型(数据库、日志记录服务、其他语言)。

              可能导致服务器退出的一个常见错误是,在运行nohup node your_path/server.js & 后,您只需单击一下即可关闭 Putty 终端。您应该改用exit 命令,然后您的节点服务器将启动并运行。

              【讨论】:

              • 如果您在执行& 时仍关闭 Putty 会话,但服务仍会关闭。 (刚刚在 Debian Jesse 上测试过)
              • 正如@NiCkNewman 所说,这个答案是不完整的!请参阅Rick Roy's answer 以获得正确的解决方案。
              • "&" 使进程在后台运行,但您实际上需要在此命令的开头添加 "nohup" 以将其与控制台窗口分离,以便应用程序不会停止几个小时后窗口进入睡眠状态,将前面提到的命令修改为:nohup node /srv/www/MyUserAccount/server/server.js &
              • AIX powersystem, nohup node myApp.js & 在 bg 中运行了该应用程序,但在期限结束时它就死了。不知道为什么。
              • @Annjawn,你必须使用exit 命令退出终端。
              【解决方案10】:

              你可以像这样使用 npm 安装forever

              sudo npm install -g forever
              

              然后启动您的应用程序:

              forever server.js
              

              或作为服务:

              forever start server.js
              

              Forever 会在您的应用因某种原因崩溃或停止时重新启动。要将重启限制为 5 次,您可以使用:

              forever -m5 server.js
              

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

              forever list
              

              注意括号中的整数并使用它来停止进程:

              forever stop 0
              

              重启一个正在运行的进程去:

              forever restart 0
              

              如果您正在处理您的应用程序文件,您可以使用-w 参数在您的server.js 文件更改时自动重新启动:

              forever -w server.js
              

              【讨论】:

              • @MarthaJames 如果它在您的 ssh 会话/窗口关闭时关闭,那么您可能忘记在 forever start <file> 中包含“开始”
              • 使用forever server.jsforever start server.js有什么区别?我知道它说它是“作为服务”,但这是什么意思?
              • 当我输入forever server.js 时,它会启动服务器。如果我按Ctrl + C,它就会停止服务。如果我输入forever start server.js,那么它会启动服务,即使我按下Ctrl + C,它也会保持打开状态。然后,您可以执行上面引用的其他命令来停止/查看列表。至少我是这样经历的。
              • 服务器重启后是否启动脚本?
              • forever 模块 (v0.15.3) 容易受到正则表达式拒绝服务攻击,不应使用:github.com/foreverjs/forever/issues/960
              【解决方案11】:

              我推荐使用 PM2,它是 Node.js 应用程序的进程管理器。 PM2 提供了一种简单的方法来管理和守护应用程序(将它们作为服务运行)。

              参考这个链接 - https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-centos-7

              【讨论】:

              【解决方案12】:

              nohup 工作我签入 AWS Ubunto vm 按照正确的syntax

              ubuntu@ip-172-00-00-00:~/ms$ nohup node server.js &
              

              然后按回车你会看到这一行

              ubuntu@ip-172-00-00-00:~/ms$ nohup: ignoring input and appending output to ‘nohup.out’
              

              然后输入这个

              rm nohup.out
              

              【讨论】:

              • 我喜欢你如何在小 bash 提示符中删除主机名,但把它留在窗口的大标题中?
              【解决方案13】:

              我发现永远可以完美地完成这项工作。

              假设你已经安装了 npm,如果没有,就这样做

              sudo apt-get install npm
              

              然后永久安装

              npm install forever --global
              

              现在可以这样运行了

              forever start app.js
              

              https://codingweb.io/run-nodejs-application-background/

              【讨论】:

              • npm rm -g 永远删除它
              【解决方案14】:

              您可以使用PM2,它是带有内置负载平衡器的 Node.js 应用程序的生产流程管理器。

              安装 PM2

              $ npm install pm2 -g
              

              启动应用程序

              $ pm2 start app.js
              

              如果你使用 express 那么你可以像这样启动你的应用程序

              pm2 start ./bin/www --name="app"
              

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

              $ pm2 list
              

              它将列出所有进程。然后,您可以使用以下命令使用应用程序的 ID 或名称来停止/重新启动服务。

              $ pm2 stop all                  
              $ pm2 stop 0                    
              $ pm2 restart all               
              

              显示日志

              $ pm2 logs ['all'|app_name|app_id]
              

              【讨论】:

              • 上帝保佑你!有用!! Forever 和 Nohup 不适用于亚马逊网络服务 bitnami nodejs 服务器 (docs.bitnami.com/aws/infrastructure/nodejs)。 PM2 效果很好!
              • 这个库似乎在 github 上启动次数最多
              【解决方案15】:

              在开发过程中,我推荐使用nodemon。每当文件更改时,它将重新启动您的服务器。正如其他人指出的那样,Forever 是一个选项,但在生产中,这完全取决于您使用的平台。 您通常会希望使用操作系统推荐的方式来保持服务正常运行(例如 http://www.freedesktop.org/wiki/Software/systemd/)。

              【讨论】:

              • 这在 MEAN.JS 应用程序上对我有用 -- nodemon 运行 grunt 命令,除非您指定服务器 JS 文件,所以我使用它来永远/同时运行 mongo 和 node
              【解决方案16】:

              你可以简单地使用这个

              nohup node /srv/www/MyUserAccount/server/server.js &
              

              这将使应用程序保持运行,如果要关闭它,你必须杀死它。

              为此,您可以安装 htop 然后搜索节点然后将其杀死

              【讨论】:

              • 请务必注意,在这种情况下,用户需要正确退出 PuTTY 会话(即通过exit 命令)。如果用户只是简单地关闭窗口,这可能会使用SIGHUP 以外的信号来结束进程,因此节点无论如何都会关闭。
              • +1 是一个简单的通用 Linux 解决方案。这比DogNibbler's answer 好。
              • @thejonwithnoh 阅读您的评论后,我尝试突然关闭腻子,但服务器仍然工作,可能与环境的配置方式有关。但我认为 OP 要求这是实现它的最简单方法
              • 我喜欢这种简单的方法,这是我正在使用的方法,至于杀死它,最简单的只是一个 killall node ,它将杀死所有节点进程,在我的情况下只有一个。
              • @Nelson 这将杀死所有节点进程如果您有多个脚本正在运行并且只想终止一个特定的脚本,我建议您找到该进程然后终止该进程以防万一在生产服务器中运行的多个节点进程,不想陷入噩梦:D
              【解决方案17】:

              我建议寻找诸如 Forever 之类的东西以在发生崩溃时重新启动 Node,并为您处理这个守护进程。

              【讨论】:

              • 我想指出的是,如果没有nohup,如果您以这种方式运行它,节点将在您退出 ssh 会话时退出(除非您使用类似 screen 到 tmux)。
              • @Haozhun,很有趣,但这不是它在我的机器上为我工作的方式。当我 ssh 进入并使用此命令启动某些东西时,它会在后台永远运行,即使在关闭 SSH 会话之后也是如此。
              • @Brad 请参阅stackoverflow.com/questions/4018154/… 上的第二个答案。似乎有些人同意该问题的第一条评论,该评论解释了nohup。如果我们能解决这个困惑,那就太好了。但我不知道从哪里开始。
              • 对于大多数 unixen(包括大多数 Linux 发行版),如果您关闭终端窗口,在后台运行仍然会终止进程。为了防止这种情况,请使用nohup 运行它。示例:nohup node app.js &
              • 我在生产 Linux 环境中使用 Forever。我通常使用命令 forever start --minUptime 10000 -o /logs/myapp.log nodeApp.js
              【解决方案18】:

              如果您只想始终在终端中运行您的节点应用程序,只需使用屏幕。

              在 ubuntu/debian 上安装:

              sudo apt-get install screen
              

              用法:

              $ screen
              $ node /path/to/app.js
              

              ctrl + a 然后ctrl + d 关闭

              要回来了:

              单屏:screen -r

              如果有多个屏幕,您可以列出所有屏幕:screen -ls

              然后:screen -r pid_number

              【讨论】:

              • 这是一个不错的选择,因为它还允许我随时将进程切换到前台
              • 谢谢你,你让我在 pm2 失败后让我入睡,原因有很多,我什至无法睁开眼睛看
              【解决方案19】:

              这是我一直用于个人项目的upstart 解决方案:

              把它放在/etc/init/node_app_daemon.conf:

              description "Node.js Daemon"
              author      "Adam Eberlin"
              
              stop on shutdown
              
              respawn
              respawn limit 3 15
              
              script
                export APP_HOME="/srv/www/MyUserAccount/server"
                cd $APP_HOME
                exec sudo -u user /usr/bin/node server.js
              end script
              

              这也将处理您的应用程序在崩溃时的重生。如果在 15 秒内崩溃 3 次或更多次,它将放弃重新启动应用程序的尝试。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-11-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-08-22
                • 2016-12-22
                • 1970-01-01
                相关资源
                最近更新 更多