raspbian Node.js исполняемый файл ищет неправильный путь
На основании этого поста здесь я попытался создать исполняемый файл в папке /etc/init.d/
с именем raumserver
со следующим содержанием:
#! /bin/sh
# /etc/init.d/raumserver
### BEGIN INIT INFO
# Provides: raumserver
# 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 raumserver.js"
# run application you want to start
node /home/openhabian/node_modules/node-raumserver/raumserver.js > /home/openhabian/node_modules/node-raumserver/logs/RPiraumserver.js
#/home/pi/downloads/node-v0.10.24-linux-arm-pi/bin/node /home/pi/test.js >> /home/pi/test.log
;;
stop)
echo "Stopping raumserver.js"
# kill application you want to stop
killall -9 node
# Not a great approach for running
# multiple node instances
;;
*)
echo "Usage: /etc/init.d/raumserver {start|stop}"
exit 1
;;
esac
exit 0
Вы видите, что мое приложение nodeJS находится в /home/openhabian/node_modules/node-raumserver/
и назван raumserver.js
Когда я запускаю этот исполняемый файл через /etc/init.d/raumserver start
Я получаю сообщение об ошибке, WARNING: No configurations found in configuration directory:/etc/init.d/config
что приводит к ошибке, поскольку в этой конфигурации заявлено использование другого порта вместо 8080, который уже используется. Таким образом, сам исполняемый файл не запускается.
Это основано на том факте, что этот исполняемый файл ищет папку config
в текущем пути исполняемый файл находится в /etc/init.d/config
которого там нет Поскольку путь к приложению nodeJS /home/openhabian/node_modules/node-raumserver/
Я ожидаю, что он будет искать там папку, которая будет доступна там.
Почему это происходит и как я могу это изменить?
Я планирую запустить этот исполняемый файл при запуске через демон. Мой план состоит в том, чтобы пойти на chmod +x /etc/init.d/raumserver
а потом sudo update-rc.d raumserver defaults
который я читаю онлайн и должен работать.
Любая идея о том, как сказать приложению искать в указанной папке nodeJS-приложения? Я вскоре подумал о копировании config
папка для /etc/init.d/
но я думаю, что это будет очень неуместно для будущих обновлений и т. д. и т. д.
заранее спасибо
2 ответа
Поскольку приложение nodeJS не мое, и я не могу его изменить, я думаю, что это не вариант.:-(
Но другой вопрос: возможно ли, чтобы текущий исполняемый файл запустил (при запуске) другой исполняемый файл, который лежит в релятивном пути, который затем будет работать гладко?
Я попытался изменить содержимое исполняемого файла. raumserver
к следующему:
### BEGIN INIT INFO
# Provides: raumserver
# 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 raumserver.js"
# run application you want to start
#node /home/openhabian/node_modules/node-raumserver/raumserver.js > /home/openhabian/node_modules/node-raumserver/logs/RPiraumserver.js
/home/openhabian/node_modules/node-raumserver/raumstartup >> /home/openhabian/node_modules/node-raumserver/logs/raumstartup.log
;;
stop)
echo "Stopping raumserver.js"
# kill application you want to stop
killall -9 node
# Not a great approach for running
# multiple node instances
;;
*)
echo "Usage: /etc/init.d/raumserver {start|stop}"
exit 1
;;
esac
exit 0
и raumstartup выглядит так:
### BEGIN INIT INFO
# Provides: raumserver
# 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 raumserver.js"
# run application you want to start
node /home/openhabian/node_modules/node-raumserver/raumserver.js > /home/openhabian/node_modules/node-raumserver/logs/RPiraumserver.js
#/home/openhabian/node_modules/node-raumserver/raumstartup >> /home/openhabian/node_modules/node-raumserver/logs/raumstartup.log
;;
stop)
echo "Stopping raumserver.js"
# kill application you want to stop
killall -9 node
# Not a great approach for running
# multiple node instances
;;
*)
echo "Usage: /etc/init.d/raumserver {start|stop}"
exit 1
;;
esac
exit 0
Но почему-то этот подход не работает.:-(Я знаю, что это не лучшая практика, но на данный момент это все еще кажется законным способом... Любые мысли о моем подходе или - даже лучше - причина, почему это не работает?
Я могу вручную запустить первый файл через sudo /etc/init.d/raumserver start
но это не запускает raumstartup:-(
Кажется, что часть вашего кода использует .
в качестве основы пути, а не с помощью __dirname
который является dirname модуля.
Если вы хотите обратиться к файлам, относящимся к модулю, вам необходимо использовать:
absolute_path = path.join(__dirname, relative_path)
Вместо того, чтобы позволить .
решиться на process.cwd()
При настройке сервисов помогает распечатать process.cwd()
также process.env
конкретно process.env.PATH
, Если они не выводят правильные значения, вы можете исправить их в настройках службы или в вашей программе,