Linux

Linux 服務無法打開顯示

  • December 5, 2018

在我執行 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 時,我收到一條錯誤消息“無法打開顯示::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'.

我知道問題與啟動與顯示器互動的服務有關,但我一直堅持如何啟用它,以便它在啟動時工作。有什麼建議麼?

你的 torcam 需要一個 X 伺服器,而 systemd 腳本並不打算使用 X 伺服器(它甚至可能在腳本執行時還沒有啟動)。

如果您需要此程序獨立於通過鍵盤/顯示器登錄的使用者訪問顯示設備/投影儀,請考慮使用兩台 X 伺服器(一台用於顯示器,一台用於投影儀),並以正確的身份驗證啟動 torcam(man xauth等)當投影機的 X 伺服器啟動時。

您需要閱讀xorg.conf以及如何將 X 伺服器限制為僅一些輸出(假設它是具有多個輸出的單個顯卡)。您還需要了解如何啟動 X 伺服器(顯示管理器xdm等,您的顯示器需要什麼,而不是直接啟動)。

引用自:https://unix.stackexchange.com/questions/485955