raspbian Node.js可执行文件寻找错误的路径

时间:2018-12-19 12:11:34

标签: node.js raspbian init.d app-startup

基于此帖子here,我试图在文件夹/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-application文件夹中查找的任何想法?我很快想到了将config文件夹复制到/etc/init.d/的方法,但是我想这对于以后的更新等非常不明智。

预先感谢

2 个答案:

答案 0 :(得分:0)

似乎您的某些代码使用.作为路径基础,而不是使用__dirname(这是模块的目录名)。

如果要寻址相对于模块的文件,则需要使用:

absolute_path = path.join(__dirname, relative_path)

而不是让.解析为process.cwd()

设置服务时,有助于同时打印process.cwd()process.env,特别是process.env.PATH。如果这些输出的值不正确,则可以在服务设置或程序中对其进行修正,

答案 1 :(得分:0)

由于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:-(