web-dev-qa-db-ja.com

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
cce1911

TorcamにはXサーバーが必要であり、systemdスクリプトはXサーバーを使用するためのものではありません(スクリプトの実行時に起動していない場合もあります)。

キーボード/モニターを介してログインするユーザーとは関係なく、このプログラムがディスプレイデバイス/プロジェクターにアクセスする必要がある場合は、2つのXサーバー(1つはモニター用、もう1つはプロジェクター用)を使用し、正しい認証でtorcamを開始することを検討してください(man xauthなど)プロジェクターのXサーバーが起動したとき。

xorg.confと、Xサーバーを一部の出力のみに制限する方法(複数の出力を備えた単一のグラフィックカードであると想定)を確認する必要があります。また、Xサーバーの起動方法(xdmなどのディスプレイマネージャー、モニターに必要なもの、直接の比較)についても確認する必要があります。

1
dirkt

Kirktが述べたように、私の問題は、rootとして実行されているXサーバーを使用しようとすることに関連していました。起動スクリプトを変更した後、サービスを正しく起動することができました。

starrtor.sh:

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