Как запустить приложение Node.js при загрузке системы?

Я работаю над 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 ответа

Решение

Если вы используете готовый релиз Pi, например 0.10.24, возможно, у вас проблема с 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, вы можете добавить путь к Defaults secure_path с помощью sudo visudo,

Кроме того, я бы порекомендовал использовать что-то вроде навсегда, чтобы ваш процесс работал после сбоев, а что нет.

Я решил эту проблему, сначала проверив, где был установлен файл 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> &

Сохраните, перезагрузите, и проблема решена!

Мохит прав, но просто для пояснения, вы можете использовать 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

Затем создайте новую работу cron, используя sudo crontab -e и добавьте следующий код в самом конце:

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

например, мой код выглядит следующим образом.

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

После перезагрузки (или запуска) ваш Node.js должен запуститься. Надеюсь, это прояснит ситуацию.

Другие вопросы по тегам