198

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

4

16 回答 16

348

我建议使用 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

延伸阅读

于 2012-11-14T22:50:15.513 回答
127

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

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

这将通过永远将当前目录中的 app.js 配置为服务。每次系统重启时服务都会自动重启。此外,当它停止时,它会尝试优雅地停止。此脚本也提供 logrotate 脚本。

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

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

于 2014-08-21T10:16:52.563 回答
34
  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>:

于 2017-06-02T21:04:32.317 回答
28

这种情况对 Debian 有效。

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

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

  • {{user}}替换您的用户名。
  • {{app path}}替换您的应用程序路径。例如,/var/www/test/app.js
于 2012-11-14T18:48:59.177 回答
13

受此答案和博客文章启发的另一种 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. 复制并粘贴(将 bob 更改为所需的用户)。

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

保存 crontab。

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

于 2014-02-18T08:27:57.603 回答
9

从所附问题复制答案。

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

安装 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]
于 2016-11-03T11:23:03.867 回答
7

You need to create a shell script in the /etc/init.d folder for that. It's sort of complicated if you never have done it but there is plenty of information on the web on init.d scripts.

Here is a sample a script that I created to run a CoffeeScript site with forever:

#!/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

I had to make sure the folder and PATHs were explicitly set or available to the root user since init.d scripts are ran as root.

于 2012-11-14T19:22:22.080 回答
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

于 2016-06-08T11:21:22.057 回答
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)。您可以尝试重新启动服务器。服务器重新启动后,您的 node.js 应用程序应该会自动运行,即使您没有通过 ssh 远程登录任何帐户。

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

echo export NODE_ENV=production >> ~/.bash_profile

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

于 2014-03-04T12:10:27.637 回答
5

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

以下是有关如何将其设置为新贵的一些文档: https ://github.com/cvee/node-upstart

于 2012-11-15T00:00:33.133 回答
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
于 2012-11-14T22:14:38.173 回答
2

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

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

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

于 2017-03-08T18:22:51.323 回答
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 非常简单并且运行良好:我的虚拟服务器发生了两次物理崩溃,因为停机时间只有大约一分钟。

于 2015-06-22T15:07:13.800 回答
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;
于 2017-01-17T11:39:13.087 回答
0

I have found my own solution by using serve & npm as follows:

  • Install serve package: npm install -g serve
  • Then have the command serve -s /var/www/sitename to execute on reboot.

This is what works for me on my VPS.

于 2021-11-13T22:01:30.587 回答
-2

您可以在 shell 中使用以下命令来永久启动您的节点:

forever app.js //my node script

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

于 2014-08-14T08:49:05.320 回答