如何使node.js应用程序永久运行?


259

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

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

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

但是,一旦我关闭腻子,那我就无法到达地址50.51.52.53:8080了。

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

您可以猜到,我是Linux和Node.js的初学者。


7
请注意,如果您出于某种原因不想使用Forever,则pm2Forever的不错选择。
凯文B

谢谢@KevinB github.com/Unitech/pm2是一个很好的选择
Sachin Chavan

Answers:


220

尽管其他答案可以解决OP的问题,但它们都是过大的,不能解释为什么他或她遇到此问题。

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

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

您的问题是,当您关闭Putty时,您将退出SSH会话,该会话会终止该进程以及所有活动的子进程。当您关闭腻子时,您无意中杀死了您的服务器,因为它是在前台运行的。为避免此行为,请在命令后附加&来在后台运行服务器:

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

这里的问题是缺乏Linux知识,而不是有关节点的问题。有关更多信息,请查看: http //linuxconfig.org/understanding-foreground-and-background-linux-processes

更新:

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

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

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

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


7
如果您仍然在执行&此操作时关闭Putty Session,则该服务仍会关闭。(刚刚在Debian Jesse上进行了测试)
NiCk Newman

1
正如@NiCkNewman所说,这个答案是不完整的!请参阅Rick Roy的答案以获取正确的解决方案。
thejonwithnoh

19
“&”使进程在后台运行,但是实际上您需要在此命令的开头添加“ nohup”,以将其从控制台窗口中分离出来,以便在窗口经过几秒钟后进入睡眠状态后,应用程序不会停止。小时,将前面提到的命令修改为:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge,2016年

2
AIX powersystem,nohup node myApp.js &在bg中运行了该应用程序,但是在关闭该术语时就死了。不知道为什么。
AnBisw

4
@Annjawn,您必须使用exit命令退出终端。
Ionut Necula '18

342

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

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

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

forever -w server.js

11
@MarthaJames如果收盘时,你的SSH会话/窗口关闭,那么你可能在忘了,包括“开始”forever start <file>
克里斯蒂安

8
forever server.js和之间有什么区别forever start server.js?我知道它说这是“作为服务”,但这意味着什么?
Marquizzo

5
当我输入时forever server.js,它将启动服务器。如果按Ctrl+ C,则它将停止服务。如果输入,forever start server.js它将启动服务,即使我按Ctrl+ 也会C保持打开状态。然后,您可以执行上面其他引用的命令,以停止/查看列表。至少这是我所经历的。
Termato '16

6
服务器重启后,是否启动脚本?
Bealalex '16

1
forever模块(v0.15.3)容易受到正则表达式拒绝服务攻击,因此不应使用:github.com/foreverjs/forever/issues/960
Benny Neugebauer

82

您可以使用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]

1
上帝祝福你!有用!!Forever and Nohup在Amazon Web Service bitnami nodejs服务器(docs.bitnami.com/aws/infrastructure/nodejs)上不起作用。PM2很棒!
polras

这个库似乎在github上启动的次数最多
DragonFire

41

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


我想指出的是,如果不使用nohup,如果以此方式运行ssh会话,则节点将退出(除非您正在使用诸如screen来进行tmux的操作)。
2013年

1
@Haozhun,有趣,但是那不是我在我的机器上工作的方式。当我使用此命令ssh并启动某些操作时,即使关闭SSH会话后,它也会在后台永久运行。
2013年

@Brad请参阅stackoverflow.com/questions/4018154/…上的第二个答案。似乎有些人同意这个问题的第一个评论nohup。如果我们能解决这种混乱,那就太好了。但是我不知道从哪里开始。
2013年

4
对于大多数unixen(包括大多数Linux发行版),如果关闭终端窗口,则在后台运行内容仍然会终止进程。为了防止这种情况运行nohup。示例:nohup node app.js &
slebetman 2013年

1
我将Forever与生产Linux环境一起使用。我通常使用永远启动命令--minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

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

在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


1
这是一个很好的选择,因为它还允许我随时将过程切换为前台
aexl

26

你可以简单地使用这个

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

这将使应用程序保持运行状态,并关闭它,您必须将其杀死。

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


18
重要的是要注意,在这种情况下,用户将需要正确地退出PuTTY会话(即通过exit命令)。如果用户只是关闭窗口,则除了SIGHUP结束该过程外,它可能还会使用其他信号,因此节点仍然会关闭。
thejonwithnoh

1
+1是一个简单的通用Linux解决方案。这比DogNibbler的答案更好。
thejonwithnoh

@thejonwithnoh在阅读您的评论后,我尝试了一下突然关闭腻子的操作,但是服务器仍然可以工作,也许与env的配置有关。但是我想出了OP所要求的,这是实现它的最简单方法
Rick Roy

我喜欢这种简单的方法,这是我正在使用的一种方法,至于杀死它,最简单的只是一个killall node,它将杀死所有节点进程,在我的情况下,只有一个。
尼尔森

@Nelson这将杀死所有节点进程,如果您正在运行多个脚本而只想终止一个特定的脚本,我建议您找到该进程,然后终止该特定的脚本,以防万一生产服务器中运行了多个节点进程不想不想做噩梦:D
里克·罗伊

12

永远是一个很好的NodeJs模块,可以做到这一点。

forever通过在命令行中键入进行安装

$ npm install forever -g

然后使用以下命令运行node.js脚本

$ forever start /path/to/script.js

你已准备好出发。另外,您可以运行

$ forever list

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

$ forever stop [pid]

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

$ forever stopall

10

我在AWS Ubunto vm中签入的nohup工作正常syntax

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

然后按Enter,您将看到此行

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

然后输入

rm nohup.out

在此处输入图片说明


3
我喜欢您如何在小bash提示符中将主机名清空,但将其保留在窗口的大标题中😂–
conny

10

安装

$ [sudo] npm install forever -g

您可以永远使用它来连续运行脚本

forever start server.js

forever list

停止服务

forever stop server.js

9

这是我用于个人项目的新贵解决方案:

将其放在/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次或更多次,它将放弃重新生成应用程序的尝试。


9

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


这对我在MEAN.JS应用程序上有效- nodemon除非指定服务器JS文件,否则运行grunt命令,因此我正在使用它永久/同时运行mongo和node
J-Dizzle



5

另一种方法是为您的应用程序创建系统单元。在“ / 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

我希望这能帮到您。

在命令行中,永久安装:

npm install forever -g

创建一个示例文件:

sudo nano server.js 

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

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

在此处输入图片说明



2

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

运行此命令

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

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

在那之后点击“ 退出 ”以关闭终端

exit

0

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

npm -g install forever

尝试:

npm -g install forever deep-equal@1.1.1

代替。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.