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


190

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


1
该服务器在云中吗?您是否有任何启动脚本?
豪尔赫·阿兰达

6
结帐PM2!它还支持启动脚本生成(systemd,systemv ...)pm2.keymetrics.io/docs/usage/startup
Unitech

Answers:


341

我建议使用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”)以列出当前安装的cron:

    $ crontab -u testuser -l 

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

鉴于forever电话node,你可能还需要提供完整路径node

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

进一步阅读


2
这种方法很好,但仅适用于系统重新启动的情况。如果服务器关闭后再打开,则此cron作业将不会执行。
ecdeveloper 2013年

6
什么让你有那个想法? en.wikipedia.org/wiki/Cron#Predefined_scheduling_definitions解释了@rebootcron在cron守护进程启动时开始运行。另外,我从来没有遇到过这样的情况,即我设置的cron @reboot不在系统引导上运行。关闭它的方式与此无关。
朱利安·兰尼根

16
它似乎/home尚未挂载,因此如果您的代码位于中,则此操作将无效/home
chovy

6
我发现以上内容对我来说失败了,因为当cron尝试永久运行时,即使使用-c选项,节点也不在路径中。但是,事实证明,只要它在schedule语句之上,就可以直接在crontab中添加PATH =语句。设置PATH之后,@reboot语句就像一个梦一样工作。
约克郡

2
感谢您的评论@chovy,它非常有帮助。对于那些使用bashrc中的环境变量的人,请注意他的评论。由于未安装/ home,因此无法使用。在crontab命令中设置变量,例如@reboot varname=value ...
lsborg 2014年

123

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

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

这将通过永久方式将当前目录中的app.js作为服务提供。每当系统重新启动时,该服务将自动重新启动。同样,当停止时,它将尝试平稳停止。该脚本还提供了logrotate脚本。

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

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


2
使用-e“ PORT = 80 ENV = prod FOO = bar”选项
arva

2
我不知道如何运行永久服务。“永久服务安装测试”中的“测试”是什么?我永远启动我的应用程序的命令是:“ / usr / local / bin / forever start -c / usr / local / bin / node / home / alex / public / node_modules / http-server / bin / http-server -s- d false”。我要写什么?
亚历克斯(Alex)

3
测试是服务的名称。当您运行永久服务安装测试时,它将创建一个名为test的服务,以在该目录中运行app.js以作为服务运行。我建议阅读gihub页面上的帮助文档,如果无法理解,请在其中添加一个问题。
阿瓦(Arva)2015年

6
在示例中forever-service install test,@ Alex(用于阐明arva的注释)test将是服务的名称,而不是要运行的实际程序/ node .js文件的名称。默认情况下,它假定程序的名称为app.js,但是您可以使用该--script标志将其覆盖,如下所示:forever-service install test --script main.js。(未经测试,如果语法有误,请纠正我。)
Dan Nissenbaum 2015年

3
@DanNissenbaum感谢您的回答。我现在正在使用效果很好的PM2。说明:digitalocean.com/community/tutorials/…–
亚历克斯

26

这种情况对Debian有效。

将以下内容添加到 /etc/rc.local

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

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

2
这种方法无法处理正常关机,尽管对于很多人而言,这可能不是问题。
UpTheCreek

6
顺便说一句-我认为您应该进行编辑/etc/rc.local,而不是/etc/init.d/rc.local
UpTheCreek

同意@UpTheCreek的观点,/etc/rc.local是添加此内容的更合适的位置-有关详细说明,请参见:unix.stackexchange.com/a/59945
所以它

2
另外,您可能希望在其中指定“当前工作目录” app.js以确保正确加载相关文件 process.chdir('/your/path/to/your/app'); -Node.js参考文档在这里
So Over It

1
如果您需要为Node.JS脚本设置环境变量(例如$ PORT表示),请添加以下行来/etc/rc.local帮助我:( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
sffc 2013年

25
  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>:


请不要对多个问题发布相同的答案
FelixSFD

我真的很喜欢pm2的改进方式,并配有出色的监控工具。希望这能为其他人更多。@ rv7我确定您已经看到了,但是有一个Windows解决方案:npmjs.com/package/pm2-windows-service。自己还没有尝试过。
John Lee

11

另一种方法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.测试bash脚本。

sh /home/bob/node_server_init.sh

5.将“ bob”替换为节点的运行时用户。

crontab -u bob -e

6.复制并粘贴(将鲍勃更改为所需的用户)。

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

保存crontab。

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


这种方法最适合我。当我将完整路径放置到server.js文件时,永远将退出。如果我在同一目录中运行它,foreveer可以正常工作。失败的原因是server.js文件包含其他文件,但是路径被弄乱了。使用这种方法,我可以将.sh脚本CD放入目录,然后运行相对于该目录的所有内容。
BeardedGeek 2015年

9

所附问题的答案已复制。

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

如何在系统启动时自动启动?您只需复制/粘贴CLI手动键入
绿色

@Green,运行,$pm2 startup之后,您将看到pm2要求手动运行命令,复制并运行该命令。那么,$pm2 save现在你app.js将生存系统重新启动
yajnesh

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

由于init.d脚本是作为root用户运行的,因此我必须确保文件夹和PATH是显式设置的,或者对root用户可用。


2
如果您有任何也以init.d开头的依赖项,则可能会遇到加载顺序问题。
UpTheCreek

@ alexandru.topliceanu我已经修复了链接。
Hector Correa 2013年

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


5

永远无法使节点应用程序作为服务运行。正确的方法是创建/ etc / inittab条目(旧的linux系统)或新贵(新的linux系统)。

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


新贵在CentOS上使我失败了,我听说它将会消失。创建一个init.d条目实际上并不是最用户友好的方法,但是我想它是Linux的:)
Jorre 2014年

5

crontab在CentOS x86 6.5上对我不起作用。@reboot似乎不起作用。

终于我得到了这个解决方案:

编辑: /etc/rc.local

sudo vi /etc/rc.local

将此行添加到文件末尾。改变USER_NAMEPATH_TO_PROJECT你自己。NODE_ENV=production表示该应用在生产模式下运行。如果您需要运行多个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 : w q return)。您可以尝试重新启动服务器。服务器重新启动后,即使您没有通过ssh远程登录任何帐户,您的node.js应用也应自动运行。

您最好NODE_ENV在shell中设置环境。NODE_ENV将在您的帐户USER_NAME登录时自动设置。

echo export NODE_ENV=production >> ~/.bash_profile

因此,您可以/PATH_TO_PROJECT/app.js通过ssh 运行诸如永久停止/启动之类的命令,而无需NODE_ENV再次设置。


在debian 7.6上也遇到了同样的问题。这对我来说是固定的。非常感谢。
Daniele Vrut 2014年

万一您不想永久使用“永久”,可以将行更改为“ su-USER_NAME -c“ NODE_ENV =生产节点/ PATH_TO_PROJECT / bin / www”“。
yaobin 2015年

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

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非常简单并且可以完美运行:自从我的虚拟服务器发生了两次物理崩溃-停机时间只有一分钟左右。


PM2在github上的恒星(2x)比永远多得多,并且还具有更多功能。我认为大多数答案在这里已经过时了。
inf3rno '16

1

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

我通过向我的etc / profile.d添加启动命令添加.sh脚本来解决此问题。profile.d中的所有.sh文件都会自动加载,并且任何命令都将被视为您使用常规sudo。

唯一的缺点是指定的用户需要登录才能开始事情,在我看来,这种情况总是如此。


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;

-1

您可以在外壳程序中使用以下命令永久启动节点:

forever app.js //my node script

您需要记住,运行应用程序的服务器应始终保持打开状态。

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.