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'.
問題がディスプレイと相互作用するサービスの開始に関連していることは理解していますが、起動時に機能するようにこれを有効にする方法に固執しています。助言がありますか?
TorcamにはXサーバーが必要であり、systemdスクリプトはXサーバーを使用するためのものではありません(スクリプトの実行時に起動していない場合もあります)。
キーボード/モニターを介してログインするユーザーとは関係なく、このプログラムがディスプレイデバイス/プロジェクターにアクセスする必要がある場合は、2つのXサーバー(1つはモニター用、もう1つはプロジェクター用)を使用し、正しい認証でtorcamを開始することを検討してください(man xauth
など)プロジェクターのXサーバーが起動したとき。
xorg.conf
と、Xサーバーを一部の出力のみに制限する方法(複数の出力を備えた単一のグラフィックカードであると想定)を確認する必要があります。また、Xサーバーの起動方法(xdm
などのディスプレイマネージャー、モニターに必要なもの、直接の比較)についても確認する必要があります。
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