在系统重启时自动启动(节点)

我正在使用节点永远的模块来保持我的节点服务器运行。 永远在系统重启时终止。 有什么办法可以自动启动节点服务器(永远),当系统重新启动?

我会build议使用crontab。 这很容易使用。

如何

  1. 要开始编辑,请运行以下命令,replace节点进程所需的运行时用户的“testuser”。 如果您select除您自己以外的其他用户,则必须使用sudo执行此操作。

    $ crontab -u testuser -e 
  2. 如果你以前从未做过这个,它会问你想编辑哪个编辑器。 我喜欢vim,但会推荐nano以方便使用。

  3. 一旦在编辑器中添加以下行:

     @reboot /usr/local/bin/forever start /your/path/to/your/app.js 
  4. 保存文件。 你应该得到一些关于cron已经安装的反馈。

  5. 要进一步确认cron的安装,请执行以下操作(再次用您的目标用户名replace“testuser”)以列出当前安装的cron:

     $ crontab -u testuser -l 

请注意,在我看来,在cron中执行二进制文件时应该总是使用完整path。 另外,如果永远脚本的path不正确,请永远运行以获取完整path。

鉴于forever调用node ,您可能还想要提供node的完整path:

 @reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js 

进一步阅读

  • crontab手册页
  • Ubuntu Cron HowTo

你可以使用永久服务来做到这一点。

 npm install -g forever-service forever-service install test 

这将永久地将当前目录中的app.js作为服务提供。 每次系统重新启动时,服务将自动重新启动。 当停下来,它会尝试一个优雅的停止。 这个脚本也提供了logrotate脚本。

Githuburl: https : //github.com/zapty/forever-service

注:我是永远服务的作者。

这个案例对Debian有效。
将以下内容添加到/etc/init.d/rc.local

/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}

{{user}}replace为您的用户名
{{app path}}replace为您的应用程序path。 例如, /var/www/test/app.js

这个答案和这个博客文章启发了另一种crontab方法。

1.创build一个bash脚本文件(将bob更改为所需的用户)。

 vi /home/bob/node_server_init.sh 

2.将其复制并粘贴到刚刚创build的文件中。

 #!/bin/sh export NODE_ENV=production export PATH=/usr/local/bin:$PATH forever start /node/server/path/server.js > /dev/null 

确保根据你的configuration编辑上面的path!

3.确保bash脚本可以被执行。

 chmod 700 /home/bob/node_server_init.sh 

4.将“bob”replace为节点的运行时用户。

 crontab -u bob -e 

5.复制并粘贴(更改bob到所需的用户)。

 @reboot /bin/sh /home/bob/node_server_init.sh 

保存crontab。

你已经做到了最后,你的奖励是重启(testing):)

使用PM2

运行服务器生产服务器的最佳select是哪一个

以这种方式运行你的应用程序的优点是什么?

  • 如果PM2崩溃,PM2会自动重启你的应用程序。

  • PM2会logging你的未处理的exception – 在这种情况下,在/home/safeuser/.pm2/logs/app-err.log文件中。

  • 使用一个命令,PM2可以确保在服务器重新引导时,它pipe理的任何应用程序都会重新启动。 基本上,您的节点应用程序将作为服务启动。

ref: https : //www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

永远不是让节点应用程序作为服务运行。 正确的做法是创build一个/ etc / inittab项(旧的linux系统)或一个新贵的(较新的linux系统)。

这里有一些关于如何设置这个新手的文档: https : //github.com/cvee/node-upstart

从附带的问题复制答案。

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

您需要在/etc/init.d文件夹中为此创build一个shell脚本。 如果你从来没有做过这样的事情,那么这很复杂,但是在init.d脚本上有很多信息。

下面是一个脚本示例,我创build了一个永久运行CoffeeScript站点的脚本:

 #!/bin/bash # # initd-example Node init.d # # chkconfig: 345 # description: Script to start a coffee script application through forever # processname: forever/coffeescript/node # pidfile: /var/run/forever-initd-hectorcorrea.pid # logfile: /var/run/forever-initd-hectorcorrea.log # # Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766 # # Source function library. . /lib/lsb/init-functions pidFile=/var/run/forever-initd-hectorcorrea.pid logFile=/var/run/forever-initd-hectorcorrea.log sourceDir=/home/hectorlinux/website coffeeFile=app.coffee scriptId=$sourceDir/$coffeeFile start() { echo "Starting $scriptId" # This is found in the library referenced at the top of the script start_daemon # Start our CoffeeScript app through forever # Notice that we change the PATH because on reboot # the PATH does not include the path to node. # Launching forever or coffee with a full path # does not work unless we set the PATH. cd $sourceDir PATH=/usr/local/bin:$PATH NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile RETVAL=$? } restart() { echo -n "Restarting $scriptId" /usr/local/bin/forever restart $scriptId RETVAL=$? } stop() { echo -n "Shutting down $scriptId" /usr/local/bin/forever stop $scriptId RETVAL=$? } status() { echo -n "Status $scriptId" /usr/local/bin/forever list RETVAL=$? } case "$1" in start) start ;; stop) stop ;; status) status ;; restart) restart ;; *) echo "Usage: {start|stop|status|restart}" exit 1 ;; esac exit $RETVAL 

我必须确保文件夹和PATH是根用户明确设置或可用的,因为init.d脚本以root身份运行。

  1. 使用NPM全局安装PM2

    npm install pm2 -g

  2. 用pm2开始你的脚本

    pm2 start app.js

  3. 生成一个活动的启动脚本

    pm2 startup

    注意:pm2启动是为了在系统重启时启动PM2。 PM2一旦启动,重新启动系统停机前所pipe理的所有进程。

如果你想禁用自动启动,只需使用pm2 unstartup

如果你想启动脚本在其他用户下执行,只需使用-u <username>选项和--hp <user_home>:

crontab在CentOS x86 6.5上不适用于我。 @reboot似乎不工作。

最后我得到这个解决scheme。

编辑/etc/rc.local

 sudo vi /etc/rc.local 

在文件末尾添加这一行。 将USER_NAME和PATH_TO_PROJECT更改为您自己的。 NODE_ENV =生产意味着应用程序以生产模式运行。 如果您需要运行多个node.js应用程序,则可以添加更多行。

 su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js" 

不要单独设置NODE_ENV,你的应用程序仍然会以开发模式运行,因为永远不会得到NODE_ENV。

 # WRONG! su - USER_NAME -c "export NODE_ENV=production" 

保存并退出vi(按ESC:wq返回)。 你可以尝试重新启动你的服务器。 服务器重新启动后,即使您没有通过ssh远程login任何帐户,node.js应用程序也应该自动运行。

你最好在你的shell中设置NODE_ENV环境。 您的帐号“USER_NAME”login后,系统会自动设置NODE_ENV。

 echo export NODE_ENV=production >> ~/.bash_profile 

所以你可以通过ssh运行命令永远停止/启动/PATH_TO_PROJECT/app.js,而不需要再次设置NODE_ENV。

我写了一个脚本,完全是这样的:

https://github.com/chovy/node-startup

我没有永远试过,但你可以自定义它运行的命令,所以它应该是直截了当的:

 /etc/init.d/node-app start /etc/init.d/node-app restart /etc/init.d/node-app stop 

我尝试了很多以上的答案。 他们都没有为我工作。 我的应用程序安装在/home和用户,而不是根。 这可能意味着,当上面提到的启动脚本运行时, /home尚未安装,所以应用程序没有启动。

然后我发现Digital Ocean的这些说明:

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

使用PM2的解释非常简单,完美:我的虚拟服务器有两次物理崩溃 – 宕机时间只有一分钟左右。

您可以在shell中使用以下命令来永久启动节点
永远app.js //我的节点脚本
你需要记住,你的应用程序运行的服务器应该始终保持开启状态。

完整的例子crontab(位于/ etc / crontab)..

 #!/bin/bash # edit this file with .. crontab -u root -e # view this file with .. crontab -u root -l # put your path here if it differs PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin # * * * * * echo "executes once every minute" > /root/deleteme @reboot cd /root/bible-api-dbt-server; npm run forever; @reboot cd /root/database-api-server; npm run forever; @reboot cd /root/mailer-api-server; npm run forever; 

rc.local的问题在于,这些命令是以root身份访问的,与以用户身份login并使用sudo不同。

我通过添加一个带有启动命令的.sh脚本来解决这个问题,我想要etc / profile.d。 profile.d中的任何.sh文件将自动加载,任何命令都将被视为使用常规的sudo。

这唯一的缺点是指定的用户需要login的东西开始在我的情况总是如此。