좋아, 이거 이상해. 나는 하루 종일 이것과 싸워왔지만 지금까지 성공하지 못했습니다. 저는 Python 기반 프로젝트를 개발 중입니다. 프로젝트는 systemd 스크립트를 통해 시작됩니다. 이상한 점은 vlc/cvlc가 어느 정도 작동하지만 dbus 제어가 없다는 것입니다. 명령줄에서 Python 애플리케이션을 실행하면 모든 것이 완벽하게 실행됩니다. systemd에서 응용 프로그램을 실행하는 것이 이상합니다.
예를 들어, 다음 코드와 서비스 스크립트로 실행하면 dbus를 사용하여 vlc를 제어할 수 없습니다. systemd 스크립트 외부에서 Python을 실행하면 dbus에 액세스할 수 있습니다. 이 문제를 일으키는 원인의 부작용인 또 다른 이상한 문제가 있습니다. 1080 vid는 잘 실행되지만 4k는 실행되지 않습니다. 다음을 시도해 보고 문제가 해결되면 알려주세요. 어떤 도움이라도 정말 감사하겠습니다. 감사해요!
Python 코드(testvlc):
#!/usr/bin/env python
from subprocess import Popen, PIPE
import time
vid = 'somevideo.mp4'
cmd = 'DISPLAY=:0 cvlc -f --no-osd %s -L' % vid
Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE)
while True:
print("Hello!")
time.sleep(5)
시스템 스크립트(testvlc.service):
[Unit]
Description=Test VLC From Python Script
[Service]
User=user
ExecStart=/usr/bin/screen -D -S testvlc -m /home/user/testvlc
[Install]
WantedBy=multi-user.target
답변1
[Unit]
Description=Test VLC From Python Script
[Service]
User=user
Environment="DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus"
ExecStart=/usr/bin/screen -D -S testvlc -m /home/user/testvlc
[Install]
WantedBy=multi-user.target
또한 실행하면 ~/.config/systemd/user
4K를 포함한 모든 것이 잘 실행됩니다. Wantby를 다음으로 변경하고 , default.target
&를 추가하고 After=graphical-session.target
, User=
&를 제거하고 Environment=
, &를 사용하세요.systemctl --user
답변2
나는 DBus를 통해 Python에서 VLC를 제어하고 싶다는 의미에서 비슷한 일을 해왔습니다.
내가 한 일은 VLC를 DBus 활성화 가능한 서비스로 설정하는 것이었습니다. 이렇게 하려면 다음 두 가지 작업을 수행해야 합니다.
- DBus 서비스 정의
- dbus가 #1에서 활동을 감지할 때 활성화될 VLC용 시스템 단위 파일을 정의합니다.
DBus 서비스의 경우 /usr/share/dbus-1/services
.I call it 이 필요합니다 org.mpris.MediaPlayer2.vlc.service
. 불행히도 사용자 디렉토리에서 설정하는 방법을 찾을 수 없습니다.
# /usr/share/dbus-1/services/org.mpris.MediaPlayer2.vlc.service
[D-BUS Service]
Name=org.mpris.MediaPlayer2.vlc
Exec=/bin/false
SystemdService=vlc.service
Name
이 정보를 통해 우리는 ( )에 의해 정의된 버스와 관련된 모든 활동에는 org.mpris.MediaPlayer2.vlc
서비스 활성화가 필요하다는 것을 DBus에 알립니다 vlc.service
. 따라서 시스템 단위 파일을 통해 이러한 서비스를 정의해야 합니다. 이 파일을 ~/.config/sytemd/user/
(사용자 서비스의 경우) 또는 /usr/lib/systemd/user/
(시스템 서비스의 경우) 에 배치할 수 있습니다 .
# vlc.service
[Unit]
Description=VLC media player DBus activated service
[Service]
Type=dbus
BusName=org.mpris.MediaPlayer2.vlc
Environment=""
ExecStart=/home/jbellon/test/ytube-dl/vlc/install/usr/bin/vlc -I "dummy"
여기서 서비스 유형은 DBus입니다. Systemd 단위 파일 설명서에서 DBus 서비스의 속성을 볼 수 있습니다.
그것을 알아낸 지 꽤 시간이 지났지만(그 이후로 변경하기가 두려웠습니다) 문제가 있다고 생각하여 cvlc
가상 인터페이스()를 사용하여 기본 프로그램을 실행했습니다 -I "dummy"
. 기본적으로는 동일합니다. .
이 문제를 해결한 후에는 Systemd가 VLC 서비스( )에 대해 알고 있고 DBus도 알고 있는지 확인하면 됩니다 systemctl daemon-reload
(이를 위해서는 DBus를 다시 시작해야 합니다).
이를 테스트하려면 내부 검사 인터페이스와 같은 모든 항목에 대해 DBus 서비스를 쿼리해 볼 수 있습니다.
$ systemctl --user status vlc --lines 0
● vlc.service - VLC media player DBus activated service
Loaded: loaded (vlc.service; bad; vendor preset: enabled)
Active: inactive (dead)
$ gdbus introspect --session --dest org.mpris.MediaPlayer2.vlc -o /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2 &> /dev/null
$ systemctl --user status vlc --lines 0
● vlc.service - VLC media player DBus activated service
Loaded: loaded (vlc.service; bad; vendor preset: enabled)
Active: active (running) since Mon 2020-08-17 22:43:53 BST; 1s ago
Main PID: 56522 (vlc)
Tasks: 4 (limit: 38349)
Memory: 2.0M
CPU: 13ms
CGroup: /user.slice/user-1000.slice/[email protected]/vlc.service
└─56522 /usr/bin/vlc -I dummy