在运行 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