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

问题描述 投票:8回答:3

我正在运行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,重启并且脚本永远不会运行。我看了一些不同的例子,做了调整,但仍然没有运气。

node.js raspbian init.d
3个回答
4
投票

如果您正在使用像0.10.24这样的预建Pi版本,则可能会遇到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,你可以使用Defaults secure_path将PATH添加到sudo visudo

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


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> &

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


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

© www.soinside.com 2019 - 2024. All rights reserved.