【问题标题】:How to start a Node.js app on system boot?如何在系统启动时启动 Node.js 应用程序?
【发布时间】: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,重新启动,脚本永远不会运行。我查看了一些不同的示例,进行了调整,但仍然没有运气。

【问题讨论】:

    标签: node.js raspbian init.d


    【解决方案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
    • 哦,我刚刚意识到 >> 在这种情况下比 > 更好,因为它会附加到日志而不是开始新的日志。这可以解释你所说的覆盖场景。
    猜你喜欢
    • 2018-03-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 2013-02-26
    • 1970-01-01
    相关资源
    最近更新 更多