Systemd

執行 VLC 的 Systemd + Python 腳本不允許 dbus 控制訪問 VLC

  • August 17, 2020

好吧,這很奇怪。我整天都在與這個作鬥爭,到目前為止還沒有成功。我正在開發一個基於 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
[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。將 Wantedby 更改為default.target& add a After=graphical-session.target, remover the User=& the Environment=, & usesystemctl --user

我一直在做類似的事情,因為我想通過 DBus 從 python 控制 VLC。

我所做的是將 VLC 設置為 DBus 可啟動服務。為此,我需要做兩件事:

  1. 定義 DBus 服務
  2. 為 VLC 定義 systemd 單元文件,當 dbus 檢測到 #1 中的活動時將啟動該文件。

對於 DBus 服務,我需要在/usr/share/dbus-1/services. 我叫它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

有了這些資訊,我們告訴 DBus 任何與Name( org.mpris.MediaPlayer2.vlc) 定義的匯流排相關的活動都需要啟動服務vlc.service。因此,我們需要通過 systemd 單元文件來定義這樣的服務。您可以將此文件放置在~/.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 服務(systemctl daemon-reload),DBus 也是如此(你需要為此重新啟動 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/user@1000.service/vlc.service
          └─56522 /usr/bin/vlc -I dummy

引用自:https://unix.stackexchange.com/questions/594928