如何在系统启动时启动 Node.js 应用程序?

Posted

技术标签:

【中文标题】如何在系统启动时启动 Node.js 应用程序?【英文标题】:How to start a Node.js app on system boot? 【发布时间】:2014-02-27 19:42:38 【问题描述】:

我正在开发一个运行 Raspbian 并运行 Node.js 应用程序的 Raspberry Pi,并尝试在 Pi 启动时启动它。我找到了几个例子,但我似乎无法让它工作。我当前的代码是:

#! /bin/sh
# /etc/init.d/MyApp

### BEGIN INIT INFO
# Provides:          MyApp.js
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts MyApp.js
# Description:       Start / stop MyApp.js at boot / shutdown.
### END INIT INFO

# If you want a command to always run, put it here

# Carry out specific functions when asked to by the system
case "$1" in
   start)
    echo "Starting MyApp.js"
    # run application you want to start
    node /home/pi/app/MyApp/MyApp.js
   ;;
   stop)
    echo "Stopping MyApp.js"
    # kill application you want to stop
    killall MyApp.js
    ;;
  *)
    echo "Usage: /etc/init.d/MyApp start|stop"
    exit 1
    ;;
esac

exit 0

我在 etc/init.d 文件夹中有这个,运行 chmod +x /etc/init.d/MyApp,我可以手动运行它,然后运行 ​​sudo update-rc.d MyApp defaults,重新启动,脚本永远不会运行。我查看了一些不同的示例,进行了调整,但仍然没有运气。

【问题讨论】:

【参考方案1】:

我通过首先检查 node.js 在 RaspberryPi 上的安装位置解决了这个问题:

which node

这给了我:

/usr/local/bin/node

打开 crontab 配置:

sudo crontab -e

然后在我的 crontab 中:

@reboot sudo /usr/local/bin/node <complete path to your .js app> &

保存,重启,问题解决!

【讨论】:

愚蠢的问题:&gt;&gt; &amp; 是做什么的?它给我抛出了一个错误。 @JeffThompson,>> 是一个错字。省略尖括号。【参考方案2】:

Mohit 是对的,但为了澄清起见,您可以使用 readlink 来查找 Node.js 应用程序的完整路径,因为稍后需要将其添加为 cron 作业。

readlink -f <<name of file >>

例如readlink -f HAP-NodeJS/Core.js 的结果是/home/pi/HAP-NodeJS/Core.js

您也可以使用which node 查找node.js 的安装完整路径

接下来,使用sudo crontab -e 创建一个新的 cron 作业,并在最后添加以下代码:

@reboot sudo /usr/local/bin/node <<.js application path>> &

例如,我的代码如下所示。

@reboot sudo /usr/local/bin/node /home/pi/HAP-NodeJS/Core.js &

重启(或启动)后,您的 Node.js 应该会运行。希望这能解决问题。

【讨论】:

感谢您详细解答! 它对我不起作用,我做了完全相同的事情。我正在使用 xrdp 远程工作它有什么影响吗?【参考方案3】:

如果您使用像 0.10.24 这样的预构建 Pi 版本,您可能会遇到 PATH 问题。

您可以提供节点二进制文件的完整路径作为start 命令的一部分,或者确保在运行/etc/init.d/MyApp 之前设置节点二进制文件的路径。我遇到了同样的问题,并且都尝试了成功。此外,您拥有的 stop 命令可能无法正常工作。

#! /bin/sh
# /etc/init.d/test

### BEGIN INIT INFO
# Provides:          test
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Example initscript
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Carry out specific functions when asked to by the system
case "$1" in
   start)
    echo "Starting test.js"
    # run application you want to start
    #node /home/pi/test.js > /home/pi/test.log
    /home/pi/downloads/node-v0.10.24-linux-arm-pi/bin/node /home/pi/test.js >> /home/pi/test.log
   ;;
   stop)
    echo "Stopping test.js"
    # kill application you want to stop
    killall -9 node
    # Not a great approach for running
    # multiple node instances
    ;;
  *)
    echo "Usage: /etc/init.d/test start|stop"
    exit 1
    ;;
esac

exit 0

如果您想做sudo node,您可以使用sudo visudo 将路径添加到Defaults secure_path

另外,我建议使用 forever 之类的东西来让您的进程在崩溃后保持运行,等等。

【讨论】:

我尝试按照建议将完整路径添加到二进制文件中,但结果相同。我可以手动启动它,但它不会在启动时启动。进行更改后,我运行 chmod +x /etc/init.d/MyApp 并删除并重新添加到 rc.d。我的计划是在我可以让它在启动时触发之后永远使用它。 当你尝试手动启动它时,你是在做 sudo /etc/init.d/MyApp start?这就是我确定我遇到 PATH 问题的方式。 正确。我打电话给sudo /etc/init.d/MyApp start 嗯...这很奇怪。您也可以以 root 身份执行节点应用程序吗?它是保持运行的应用程序,例如 Web 服务器吗?您是否尝试像我的示例中使用&gt; test.log 将输出通过管道传输到日志并检查日志?我无法从/var/log 的任何文件中找到问题的日志,但也许我错过了。我不确定Provides: MyApp.js 是否是问题所在,但您可能想尝试Provides: MyApp 哦,我刚刚意识到 >> 在这种情况下比 > 更好,因为它会附加到日志而不是开始新的日志。这可以解释你所说的覆盖场景。

以上是关于如何在系统启动时启动 Node.js 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

启动 Node.js 控制台时如何运行脚本?

如何在 AWS 上的 Amazon Linux AMI 中自动启动 node.js 应用程序?

如何从 PHP 文件启动 Node.js

在 node.js 重新启动之前不会删除文件/目录

如何将 node.js 服务器作为守护进程启动?

Java 启动 Node.js 程序立即关闭