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

时间:2014-02-04 03:14:05

标签: node.js raspbian init.d

我正在运行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 个答案:

答案 0 :(得分:26)

我首先检查了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> &

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

答案 1 :(得分:8)

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应该运行。希望这可以解决问题。

答案 2 :(得分:4)

如果您使用的是0.10.24之类的预建Pi版本,则可能会遇到路径问题。

您可以提供节点二进制文件的完整路径作为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,可以使用Defaults secure_path将PATH添加到sudo visudo

此外,我建议使用类似forever之类的内容,以便在崩溃后保持您的流程正常运行。