nginx RTMPサーバーからビデオフレームを要求するPythonスクリプトを作成しました。要求が空のバイト文字列として返されると、VLC / FFMPEGプロセスが終了し、libreofficeがImpressスライドショーとして表示されます。このPythonスクリプトは端末で正しく実行されますが、systemdで実行するとlibreoffice部分が失敗します。
Runは、htop
libreofficeを実行するために実行されたコマンドを示していますsoffice --impress --norestore -invisible --show test.pptx
。
もちろん、画面には実際には何も表示されません。私が見る唯一のエラーは、次のエラーです。Can't get display
これは私のユニットファイルです:
[Unit]
Description=Polls the RTMP Server for a valid video feed
Wants=network-online.target
After=network-online.target
[Service]
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/python3 -u /home/pi/stream_script/launch_stream.py
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
VLCを起動するために、Pythonスクリプトで次のコード行を使用しました。
# Show the stream
vlc_process = subprocess.Popen("cvlc --fullscreen --avcodec-threads=0 " + STREAM, stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)
プロセスを終了する次のコマンド
os.killpg(os.getpgid(vlc_process.pid), signal.SIGTERM) # Send the signal to all the process groups
私は確かにsystemdの専門家ではありませんが、以前は何の問題もなく何度も試してみましたが、グラフィックアプリケーションでは使用したことがありません。 Systemdはグラフィックリソースにアクセスできませんか?
比較的簡単な問題であればお詫び申し上げます...数日間迷っていましたが、解決策が見つかりませんでした。上記のエラーに関して私が調査した内容のほとんどは、ヘッドレスのlibreoffice操作に関連しています。
答え1
これは、ユーザーサービス(少なくとも手動で開始するか、ログイン後にのみ開始されるサービス)として機能しますが、システムサービスでは機能しません。
$ systemctl show-environment
LANG=de_DE.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ systemctl --user show-environment
HOME=/home/hl
LANG=de_DE.UTF-8
LOGNAME=hl
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
USER=hl
XDG_RUNTIME_DIR=/run/user/1000
XDG_DATA_DIRS=/home/hl/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DISPLAY=:0
XAUTHORITY=/home/hl/.Xauthority