raspbian Node.js исполняемый файл ищет неправильный путь - PullRequest
0 голосов
/ 19 декабря 2018

на основе этого поста здесь Я попытался создать исполняемый файл в папке /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

Вы видите, что мой узелJSприложение находится в /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 ]

0 голосов
/ 19 декабря 2018

Поскольку приложение 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: - (

0 голосов
/ 19 декабря 2018

Кажется, что часть вашего кода использует . в качестве основы пути, а не __dirname, который является dirname модуля.

Если вы хотите обратиться к файлам относительно модуля,вам нужно использовать:

absolute_path = path.join(__dirname, relative_path)

Вместо того, чтобы . разрешить до process.cwd()

. При настройке служб помогает печатать process.cwd() также process.env, в частности process.env.PATH,Если они не выводят правильные значения, вы можете исправить их в настройках службы или в вашей программе,

...