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, Если они не выводят правильные значения, вы можете исправить их в настройках службы или в вашей программе,

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