运行服务 spacenavd start 与 /etc/init.d/spacenavd start 不同

运行服务 spacenavd start 与 /etc/init.d/spacenavd start 不同

我有一个使用 3dconnexion 空间鼠标的应用程序。使用spacenavd守护进程时,它工作正常,但是我在启动时或作为服务运行守护进程时遇到了问题。

$ sudo 服务 spacenavd 启动

在 /var/log/spnavd.log 中

Spacenav daemon 0.5
failed to open config file /etc/spnavrc: No such file or directory. using defaults.
Device detection, parsing /proc/bus/input/devices
using device: /dev/input/event5
device name: 3Dconnexion SpaceNavigator
trying to open X11 display ":0.0"
XAUTHORITY=/root/.Xauthority
No protocol specified
No protocol specified
failed to open X11 display ":0.0"
waiting for X socket file to appear

但是,当我运行系统 V 初始化脚本时,没有遇到任何问题:

$ sudo /etc/init.d/spacenavd 启动

在 /var/log/spnavd.log 中

Spacenav daemon 0.5
failed to open config file /etc/spnavrc: No such file or directory. using defaults.
Device detection, parsing /proc/bus/input/devices
using device: /dev/input/event5
device name: 3Dconnexion SpaceNavigator
trying to open X11 display ":0"
XAUTHORITY=/home/sam/.Xauthority

问题是我需要守护进程从启动时启动,而不是手动启动它,这需要 sudo 访问权限。

编辑(来自 muru 的建议)

我制作了以下新贵脚本

description "Spacenavd upstart script. Starts after lightdm to allow for binding with the Xorg server"
author "Samuel Charreyron"

start on started lightm
stop on shutdown

pre-start script
    echo "Starting spacenavd daemon"
end script

script 
    env DISPLAY=:0.0
    exec /usr/sbin/spacenavd -v -d 2> /var/log/spnavd.log
end script

pre-stop script
    echo "Stopping spacenavd daemon"
    # detect daemon's process id
    pid=`cat /var/run/spnavd.pid 2>/dev/null`
    if [ $? != 0 ]; then
        pid=`ps -e | grep spacenavd | awk '{ print $1 }'`
        if [ -z "$pid" ]; then
             echo 'spacenavd daemon is not running, nothing to do.'
             exit 1
        fi
    fi
    kill $pid
end script

我发现 spacenavd 无法连接到 Xorg 服务器。事实上,任何以 root 身份运行的 upstart 脚本似乎都无法使用 Xorg。我该怎么做呢,因为 spacenavd 需要 sudo 访问 USB 设备?

答案1

默认情况下,root 没有权限访问 Xserver。要启用它,您需要将 /home/sam/.Xauthority 文件复制到 /root/.Xauthority

sudo cp /home/sam/.Xauthority /root/

重启后,只需在启动时启用 spacenavd 守护进程:

sudo service spacenavd enable

并启动spacenavd服务:

sudo service spacenavd start

相关内容