Linux服务无法打开显示

Linux服务无法打开显示

在运行 Ubuntu 16.04.3 LTS 的 Odroid 上,我有一个与显示设备(投影仪)交互的 python2 程序。当我从命令行运行该程序时:

python ~/imgProc/torcam.py

一切正常。我希望这个程序在启动时运行,所以我创建了一个服务文件:

/lib/systemd/system/torcam.service

它包含以下内容:

[Unit]
Description=Torcam Service
After=rc-local.service network-online.target    
[Service]
User=root
ExecStart=/home/odroid/imgProc/starttor.sh
[Install]
WantedBy=multi-user.target

启动脚本 starttor.sh 包含:

#!/bin/bash
export DISPLAY=:0
cd /home/odroid/imgProc
python ./torcam.py

如果我从命令行运行此脚本,一切正常,但是当我在启动时运行此脚本或使用 systemctl 时,我收到一条错误消息“cannont open display: :0”

这是我安装该服务的方法:

odroid@odroid:~/imgProc$ sudo systemctl enable torcam
odroid@odroid:~/imgProc$ sudo systemctl start torcam
odroid@odroid:~/imgProc$ sudo systemctl status torcam

这是输出:

odroid@odroid:~/imgProc$ sudo systemctl status torcam
● torcam.service - Torcam Service    
   Loaded: loaded (/lib/systemd/system/torcam.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Fri 2016-02-12 08:39:21 EST; 6min ago
   Process: 1807 ExecStart=/home/odroid/imgProc/starttor.sh (code=exited, status=1/FAILURE)
Main PID: 1807 (code=exited, status=1/FAILURE)

Feb 12 08:39:19 odroid systemd[1]: Started Torcam Service.
Feb 12 08:39:19 odroid systemd[1807]: torcam.service: Executing: /home/odroid/imgProc/starttor.sh
Feb 12 08:39:21 odroid starttor.sh[1807]: No protocol specified
Feb 12 08:39:21 odroid starttor.sh[1807]: (test:1808): Gtk-WARNING **: cannot open display: :0
Feb 12 08:39:21 odroid systemd[1]: torcam.service: Main process exited, code=exited, status=1/FAILURE
Feb 12 08:39:21 odroid systemd[1]: torcam.service: Unit entered failed state.
Feb 12 08:39:21 odroid systemd[1]: torcam.service: Failed with result 'exit-code'.

我知道问题与启动与显示器交互的服务有关,但我一直不知道如何启用它以便它在启动时工作。有什么建议么?

答案1

你的torcam需要一个X服务器,而systemd脚本并不意味着使用X服务器(当脚本运行时它甚至可能还没有启动)。

如果您需要此程序独立于用户通过键盘/显示器登录来访问显示设备/投影仪,请考虑使用两个 X 服务器(一台用于显示器,一台用于投影仪),并使用正确的身份验证启动 torcam(man xauth等等)当投影仪的 X 服务器启动时。

您需要阅读xorg.conf以及如何将 X 服务器限制为仅某些输出(假设它是具有多个输出的单个显卡)。您还需要了解 X 服务器是如何启动的(显示管理器等xdm,您的显示器需要什么,还是直接启动)。

答案2

正如 kirkt 提到的,我的问题与尝试使用以 root 身份运行的 X 服务器有关。修改启动脚本后,我能够使服务正确启动。

斯塔尔托.sh:

#!/bin/bash
sleep 10
export DISPLAY=:0
cd /home/odroid/imgProc
exec sudo -u odroid /bin/sh - << eof
python ./torcam.py

相关内容