我正在尝试使用 upstart 在“input-device-added”事件上启动守护进程,但是如果有人知道在不涉及 Upstart 的相同事件上启动某些东西的其他方法,我也会非常高兴。无论如何,当发出 input-device-added 事件时,myservice.conf 会被正确调用,并且脚本的前几行会被解析。但是当守护进程启动时,它永远不会完全开始运行,Upstart 似乎过早地杀死了它。
我尝试过以两种不同的方式使用 Upstart,但都遇到了同样的问题:
author "AnVoWiDo"
start on input-device-added
script
device='printinputdevices | grep thecorrectdevice'
echo $device
/start/my/daemon -option device
end script
并且
author "AnVoWiDo"
start on input-device-added
exec myscript.sh
其中 myscript.sh 文件包含上述脚本。其中的 echo 命令仅用于诊断,并且在两种方法中均能正确输出。
从终端运行 myscript.sh 将完美地启动守护进程,并产生所有预期的输出。运行“/start/my/daemon -option device”命令也是如此,两者都会输出类似以下内容的内容
device 0: /dev/input/event9 mydevice
Display name: :0
但是当从 Upstart 启动它时(使用 service myservice start 或插入新的输入设备),输出会在中途“显示名称::0”停止,并且只记录“显示名称:”,此时 Upstart 终止该进程。在我看来,输出中的双冒号是罪魁祸首(或者当然是 :0),也许 Upstart 将其误认为是某种错误代码?
有谁知道在正确时刻启动服务的其他方法吗?也许我在制作 Upstart conf 文件时错过了一些愚蠢而明显的问题,这些问题可以修复吗?最后,也许可以以某种方式说服 Upstart 忽略输出中的“::0”(当然,如果这确实是原因的话)并继续运行守护进程?
答案1
显示名称 :0 指的是 X 显示器。它在您的 GUI 终端中工作,因为 $DISPLAY 设置为 :0。
如果你希望服务在你的 GUI 上启动,那么你应该这样做
env DISPLAY=":0"
exec /start/my/daemon
答案2
Upstart 以 root 身份运行脚本,可能没有设置 DISPLAY 环境(由脚本 debug: 演示)Display name: <empty>
。当您从命令行运行脚本时,DISPLAY 将取自您的用户帐户环境并被正确设置。
您可以使用 SpamapS 的答案将 DISPLAY 添加到作业环境中,或者使用 运行命令exec su - <your account> ...
。