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

时间:2012-11-14 18:31:41

标签: node.js centos forever

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

15 个答案:

答案 0 :(得分:329)

我建议使用crontab。它很容易使用。

如何

  1. 要开始编辑,请运行以下命令,将“testuser”替换为节点进程所需的运行时用户。如果您选择的不是其他用户,则必须使用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,请执行以下操作(再次使用目标用户名替换“testuser”)以列出当前安装的crons:

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

    鉴于forever来电node,您可能还想提供node的完整路径:

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

    进一步阅读

答案 1 :(得分:119)

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

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

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

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

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

答案 2 :(得分:24)

此案适用于Debian 将以下内容添加到/etc/rc.local

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

{{user}}替换为您的用户名
{{app path}}替换为您的应用路径。例如,/var/www/test/app.js

答案 3 :(得分:17)

  1. 使用NPM全局安装PM2

    npm install pm2 -g

  2. 使用pm2

    启动脚本

    pm2 start app.js

  3. 生成活动启动脚本

    pm2 startup

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

  4. 如果您想要禁用自动启动,只需使用pm2 unstartup

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

答案 4 :(得分:10)

另一种受this回答和this博客帖子启发的crontab方法。

<强> 1。创建一个bash脚本文件(将bob更改为所需的用户)。

vi /home/bob/node_server_init.sh

<强> 2。将其复制并粘贴到刚刚创建的文件中。

#!/bin/sh

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

请务必根据您的配置修改上述路径!

第3。确保可以执行bash脚本。

chmod 700 /home/bob/node_server_init.sh

<强> 4。将“bob”替换为节点的运行时用户。

crontab -u bob -e

<强> 5。复制并粘贴(将bob更改为所需用户)。

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

保存crontab。

你已经完成了,你的奖金是重启(测试):)

答案 5 :(得分:9)

来自附件question的复制答案。

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

安装PM2

imshow(image,[min(min(mean)),max(max(mean))]);

启动应用程序

$ npm install pm2 -g

如果您使用快递,则可以启动您的应用

$ pm2 start app.js

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

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

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

$ pm2 list

显示日志

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

答案 6 :(得分: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

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

答案 7 :(得分: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

答案 8 :(得分:5)

永远不会让节点应用程序作为服务运行。正确的方法是创建/ etc / inittab条目(旧的Linux系统)或新手(更新的Linux系统)。

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

答案 9 :(得分:5)

crontab在CentOS x86 6.5上对我不起作用。 @reboot似乎无法正常工作。

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

编辑/etc/rc.local

sudo vi /etc/rc.local

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

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:w q返回)。您可以尝试重新启动服务器。服务器重新启动后,即使您没有通过ssh远程登录任何帐户,您的node.js应用程序也应自动运行。

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

echo export NODE_ENV=production >> ~/.bash_profile

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

答案 10 :(得分:3)

我写了一个完全符合这个要求的脚本:

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

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

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

答案 11 :(得分:1)

我尝试了很多上述答案。他们都没有为我工作。我的应用安装在/home和用户,而不是root用户。这可能意味着当上面提到的启动脚本运行时,/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非常简单并且工作正常:我的虚拟服务器有两次物理崩溃 - 停机时间只有一分钟左右。

答案 12 :(得分:1)

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

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

唯一的缺点是指定的用户需要登录才能启动,在我的情况下总是这样。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

完整的示例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;