首页 文章

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

提问于
浏览
8

我正在运行Raspberry Pi运行Raspbian运行Node.js应用程序,并尝试在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 ,重启并且脚本永远不会运行 . 我看了一些不同的例子,做了调整,但仍然没有运气 .

3 回答

  • 8

    我首先检查了RaspberryPi上安装了node.js的位置,从而解决了这个问题:

    which node
    

    这给了我:

    /usr/local/bin/node
    

    打开crontab配置:

    sudo crontab -e
    

    然后在我的crontab中:

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

    保存,重启,问题解决了!

  • 26

    如果您使用的是预先构建的Pi版本,如0.10.24,则可能会遇到PATH问题 .

    您可以提供节点二进制文件的完整路径作为 start 命令的一部分,或者确保在运行 /etc/init.d/MyApp 之前设置节点二进制文件的PATH . 我有同样的问题,并尝试了两个成功 . 此外,您拥有的 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 将PATH添加到 Defaults secure_path .

    此外,我建议使用像forever这样的东西来保持你的进程在崩溃后运行,什么不是 .

  • 4

    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应该运行 . 希望这能清除事情 .

相关问题