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

keh*_*ers 186 centos node.js forever

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

Jul*_*gan 339

我建议使用crontab.它易于使用.

如何

  1. 要开始编辑,请运行以下命令,将"testuser"替换为节点进程所需的运行时用户.如果您选择的不是其他用户,则必须使用sudo运行此用户.

    $ crontab -u testuser -e
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您之前从未这样做过,它会询问您要编辑哪个编辑器.我喜欢vim,但会推荐nano以方便使用.

  3. 进入编辑器后,添加以下行:

    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
    
    Run Code Online (Sandbox Code Playgroud)
  4. 保存文件.您应该获得一些已安装cron的反馈.

  5. 要进一步确认安装cron,请执行以下操作(再次使用目标用户名替换"testuser")以列出当前安装的crons:

    $ crontab -u testuser -l 
    
    Run Code Online (Sandbox Code Playgroud)

请注意,在我看来,在cron中执行二进制文件时应始终使用完整路径.此外,如果您的永久脚本的路径不正确,请运行which forever以获取完整路径.

鉴于这些forever电话node,您可能还想提供完整路径node:

@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js
Run Code Online (Sandbox Code Playgroud)

进一步阅读

  • 这应该被认为是最好的答案. (29认同)
  • 似乎`/ home`尚未安装,所以如果您的代码位于`/ home`,这将无效. (16认同)
  • 什么让你有那个想法?http://en.wikipedia.org/wiki/Cron#Predefined_scheduling_definitions解释`@ reboot` cron在cron deamon启动时运行.要添加我从来没有遇到过这样的情况,即我的cron设置在`@ reboot`不会在系统启动时运行.关闭它的方式与此无关. (6认同)
  • 我发现上面的失败对我来说是因为当cron尝试永远运行时节点不在路径中,即使使用-c选项也是如此.但是,事实证明,只要它在schedule语句之上,就可以直接在crontab中添加PATH =语句.一旦设置了PATH,@reboot语句就像梦一样. (6认同)
  • 这种方法很好,但仅限于系统重新启动时的情况.如果服务器已关闭然后再打开电源,则此cron作业将不会执行. (2认同)
  • 感谢您对@chovy的评论,这非常有帮助.对于那些使用bashrc环境变量的人,请记住他的评论.由于/ home未安装,因此无效.在crontab命令中设置变量,如`@reboot varname = value ...` (2认同)
  • 由express.js创建的应用程序使用`bin/www`来启动服务,`bin/www`使用`#!/ usr/bin/env node`语法来要求node.js处理它,不幸的是`/ usr/local/bin`不在引导路径中,所以我的解决方案是将以下行放在我的crontab文件的顶部:`PATH =/usr/local/sbin:/ usr/local/bin:/ usr/sbin:/ usr/bin:/ sbin:/ bin`扩展root用户的PATH变量,对我有用 (2认同)

arv*_*rva 122

您可以使用forever-service来执行此操作.

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

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

Github网址:https://github.com/zapty/forever-service

注意:我是永远服务的作者.

  • @Alex - 澄清arva的注释 - 在示例`forever-service install test`中,`test`将是**服务**的名称,但不是要运行的实际程序/节点.js文件的名称.默认情况下,它假定程序的名称是`app.js`,但您可以使用`--script`标志覆盖它,如下所示:`forever-service install test --script main.js`.(未经测试,如果有任何语法细节错误,请纠正我.) (6认同)
  • 这里测试的是服务的名称.当你运行forever-service install test时,它会创建一个名为test的服务,在该目录中运行app.js作为服务运行.我建议您阅读gihub页面上的帮助文档,如果您无法理解,请在那里添加一个问题. (3认同)
  • @DanNissenbaum感谢您的回答.我现在正在使用PM2,它工作得很漂亮.说明:https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps (3认同)
  • 使用-e"PORT = 80 ENV = prod FOO = bar"选项 (2认同)
  • 我不知道如何永远运行服务."永久服务安装测试"中的"测试"是什么?我永远启动我的应用程序的命令是:"/ usr/local/bin/forever start -c/usr/local/bin/node/home/alex/public/node_modules/http-server/bin/http-server -s - d false".我要写什么? (2认同)
  • Windows操作系统用户,请注意它还不支持,我刚刚实现了解锁安装服务命令! (2认同)

NiL*_*iLL 25

这个案例适用于Debian.
添加以下内容/etc/rc.local

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

{{user}}替换为您的用户名
{{app path}}替换为您的应用路径.例如,{{user}}

  • BTW - 我认为你应该编辑`/ etc/rc.local`,而不是`/ etc/init.d/rc.local` (6认同)
  • 这种方法不适用于优雅的关闭,但对很多人来说这可能不是问题. (2认同)
  • 此外,您可能希望在`app.js`中指定'当前工作目录'以确保正确加载相关文件 - `process.chdir('/ your/path/to/your/app');`Node.js ref docs [here](http://nodejs.org/api/process.html#process_process_chdir_directory) (2认同)

小智 22

  1. 使用NPM全局安装PM2

    npm install pm2 -g

  2. 使用pm2启动脚本

    pm2 start app.js

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

    pm2 startup

    注意:pm2启动用于在系统重新启动时启动PM2.PM2一旦启动,重新启动系统停机前管理的所有进程.

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

如果您希望在另一个用户下执行启动脚本,只需使用-u <username>选项和--hp <user_home>:


Emr*_*mre 10

另一个crontab方法的灵感来自这个答案和这篇博文.

1.创建bash脚本文件(将bob更改为所需用户).

vi /home/bob/node_server_init.sh
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/sh

export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null
Run Code Online (Sandbox Code Playgroud)

确保根据您的配置编辑上面的路径!

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

chmod 700 /home/bob/node_server_init.sh
Run Code Online (Sandbox Code Playgroud)

4.将"bob"替换为节点的运行时用户.

crontab -u bob -e
Run Code Online (Sandbox Code Playgroud)

5.复制并粘贴(将bob更改为所需用户).

@reboot /bin/sh /home/bob/node_server_init.sh
Run Code Online (Sandbox Code Playgroud)

保存crontab.

你已经做到了最后,你的奖金是重启(测试):)


Vik*_*hit 9

从附带的问题复制回答.

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

安装PM2

$ npm install pm2 -g
Run Code Online (Sandbox Code Playgroud)

启动一个应用程序

$ pm2 start app.js
Run Code Online (Sandbox Code Playgroud)

如果您使用快递,那么您可以启动您的应用程序

pm2 start ./bin/www --name="app"
Run Code Online (Sandbox Code Playgroud)

列出所有正在运行的进

$ pm2 list
Run Code Online (Sandbox Code Playgroud)

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

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               
Run Code Online (Sandbox Code Playgroud)

显示日志

$ pm2 logs ['all'|app_name|app_id]
Run Code Online (Sandbox Code Playgroud)


Hec*_*rea 7

您需要在/etc/init.d文件夹中创建一个shell脚本.如果你从来没有这样做过,那有点复杂,但是在init.d脚本上网上有很多信息.

以下是我为永久运行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
Run Code Online (Sandbox Code Playgroud)

我必须确保为root用户显式设置或使用文件夹和PATH,因为init.d脚本以root身份运行.

  • 如果您有任何依赖于init.d的依赖项,则可能会遇到加载顺序问题. (2认同)

Vis*_*hra 6

使用PM2

哪个是运行服务器生产服务器的最佳选择

以这种方式运行应用程序有什么好处?

  • 如果应用程序崩溃,PM2将自动重启您的应用程序.

  • PM2将记录未处理的异常 - 在本例中,在/home/safeuser/.pm2/logs/app-err.log中的文件中.

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

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


sne*_*nez 5

Forever并未将节点应用程序作为服务运行.正确的方法是创建/ etc/inittab条目(旧的linux系统)或upstart(较新的linux系统).

这里有一些关于如何将其设置为暴发户的文档:https: //github.com/cvee/node-upstart


Vin*_*uan 5

crontab在CentOS x86 6.5上不适用于我.@reboot似乎无法正常工作.

最后我得到了这个解决方案

编辑/etc/rc.local

sudo vi /etc/rc.local
Run Code Online (Sandbox Code Playgroud)

在文件末尾添加此行.将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"
Run Code Online (Sandbox Code Playgroud)

不要将NODE_ENV设置在单独的行中,您的应用程序仍将以开发模式运行,因为永远不会获得NODE_ENV.

# WRONG!
su - USER_NAME -c "export NODE_ENV=production"
Run Code Online (Sandbox Code Playgroud)

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

您最好在shell中设置NODE_ENV环境.当您的帐户USER_NAME登录时,系统会自动设置NODE_ENV.

echo export NODE_ENV=production >> ~/.bash_profile
Run Code Online (Sandbox Code Playgroud)

因此,您可以通过ssh运行诸如forever stop/start /PATH_TO_PROJECT/app.js之类的命令,而无需再次设置NODE_ENV.