Как запустить приложение 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 должен запуститься. Надеюсь, это прояснит ситуацию.