我编写了一个 Python 脚本,用于从 nginx RTMP 服务器请求视频帧。如果该请求作为空字节字符串返回,则应终止 VLC / FFMPEG 进程,并以 Impress 幻灯片演示形式显示 libreoffice。这个 Python 脚本在终端上运行得很好,但是当从 systemd 执行时,它的 libreoffice 部分会失败。
运行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
我在 Python 脚本中使用了以下代码行来启动 VLC
# 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