如何使一个node.js应用程序永久运行?
在Debian服务器上,我安装了Node.js. 我知道如何用这个命令行从putty启动一个应用程序:
node /srv/www/MyUserAccount/server/server.js
并在地址50.51.52.53:8080
和端口)上得到它。
但是,只要我closures腻子,那么我不能再达到地址50.51.52.53:8080
。
如何使一个NodeJS应用程序永久运行?
你可以猜到,我是一个Linux和Node.js的初学者。
虽然其他答案解决了OP的问题,但这些都是矫枉过正的,并没有解释为什么他或她经历了这个问题。
关键是这一行,“我closures腻子,然后我不能达到地址”
当您通过Puttylogin到远程主机时,您已经启动了SSH Linux进程,并且从该SSH会话中键入的所有命令将作为所述进程的subprocess执行。
你的问题是,当你closuresPutty时,你正在退出SSH会话,这个会话将会终止进程和任何活动的subprocess。 当你closures腻子时,你会无意中杀死你的服务器,因为你在前台运行它。 为了避免这种情况,可以在后台运行服务器,并在命令后加上&:
node /srv/www/MyUserAccount/server/server.js &
这里的问题是缺乏Linux的知识,而不是一个关于节点的问题。 有关更多信息,请参阅 : http : //linuxconfig.org/understanding-foreground-and-background-linux-processes
更新:
如其他人所提到的,节点服务器在退出terminal时可能仍然死亡。 我遇到的一个常见问题是,尽pipe节点进程在bg中运行,但stdout和stderr仍然指向terminal。 这意味着,如果节点服务器写入console.log或console.error,它将收到一个损坏的pipe道错误和崩溃。 这可以通过pipe道输出你的过程来避免:
node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &
如果问题仍然存在,那么应该研究像tmux或nohup这样的方法,它们比节点特定的解决scheme更加健壮,因为它们可以用来运行所有types的进程(数据库,日志logging服务和其他语言)。
你可以像这样使用npm永远安装:
sudo npm install -g forever
然后开始你的应用程序:
forever server.js
或作为服务:
forever start server.js
永远重新启动您的应用程序,当它崩溃或由于某种原因停止。 要限制重新启动到5您可以使用:
forever -m5 server.js
列出所有正在运行的进程:
forever list
请注意括号中的整数,并按以下方式使用它来停止进程:
forever stop 0
重新启动正在运行的进程:
forever restart 0
如果您正在处理应用程序文件,则只要server.js
文件发生更改,就可以使用-w
参数自动重新启动:
forever -w server.js
我build议寻找诸如Forever之类的东西,以在发生崩溃时重新启动Node,并为您处理守护进程。
您可以使用PM2 ,它是具有内置负载均衡器的Node.js应用程序的生产过程pipe理器。
安装PM2
$ npm install pm2 -g
启动应用程序
$ pm2 start app.js
如果你使用快递,那么你可以启动你的应用程序
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]
如果你只是想在terminal上运行你的节点应用程序,只需使用屏幕即可。
安装在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
你可以简单地使用这个
nohup node /srv/www/MyUserAccount/server/server.js &
这将保持应用程序运行,并closures它,你将不得不杀死它。
为此,您可以安装htop
,然后search节点,然后杀死它
这是我用于个人项目的一个暴发户解决scheme:
把它放在/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次或更多次,它将放弃尝试重新生成应用程序。
在开发过程中,我推荐使用nodemon 。 只要文件发生变化,它就会重新启动服务器。 正如其他人所指出的, 永远是一个select,但在生产中,这一切都取决于你使用的平台。 您通常会希望使用操作系统推荐的方法来维护服务(例如http://www.freedesktop.org/wiki/Software/systemd/ )。
我永远find完美的工作。
假设你已经安装了npm,如果没有,就这样做
sudo apt-get install npm
然后永远安装
npm install forever --global
现在你可以像这样运行它
forever start app.js
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'
然后input这个
rm nohup.out
我build议使用PM2,它是Node.js应用程序的进程pipe理器。 PM2提供了一种简单的方式来pipe理和守护应用程序(将它们作为服务运行)。
另一种方法是为您的应用程序创build一个系统单元。 创build一个“XXX.service”文件“/ etc / systemd / system”文件夹:
[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来pipe理它:
systemctl start XXX
启动服务, systemctl stop XXX
停止它, systemctl enable XXX
自动启动应用程序,当系统启动。