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 서버가 시작될 때.
X 서버를 특정 출력으로만 제한하는 방법을 읽어야 합니다 xorg.conf
(여러 출력이 있는 단일 그래픽 카드라고 가정). 또한 X 서버가 시작되는 방법(디스플레이 관리자 등 xdm
, 디스플레이에 필요한 것이 무엇인지 또는 직접 시작되는지)을 이해해야 합니다 .
답변2
kirkt가 언급했듯이 내 문제는 루트로 실행되는 X 서버를 사용하려는 것과 관련이 있습니다. 시작 스크립트를 수정한 후 서비스가 올바르게 시작되도록 할 수 있었습니다.
stalto.sh:
#!/bin/bash
sleep 10
export DISPLAY=:0
cd /home/odroid/imgProc
exec sudo -u odroid /bin/sh - << eof
python ./torcam.py