web-dev-qa-db-ja.com

dbusを使用して同じアプリケーションの複数のインスタンスを制御しますか?

問題

dbusを使用して、ターミナルからVLCメディアプレーヤーの複数のインスタンスを制御しようとしています。

VLCの単一インスタンスにdbusを使用しても問題ありません。VLCが起動するとすぐに、Play/Pauseなどのコマンド、

dbus-send --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause

期待どおりに動作します。ただし、VLCの2番目のインスタンスを起動した場合、dbus-sendコマンドは登録されません。最初のインスタンスはすべてのコマンドを正常に登録しますが、2番目のインスタンスは反応しません。

私が試したこと

dbus-launch vlc

dbus-launch vlcを使用してみました。 dbus-launchのみを使用すると、セッションバスインスタンスが作成され、一意の識別アドレスが出力されます。 ps -aux | grep dbusを使用して実行中のインスタンスを確認することもできます。アドレスを使用して、dbus-send --address=Xを使用してコマンドを送信できます。

ただし、dbus-launch vlcを使用する場合、新しいバスに関する情報を標準出力(識別アドレスを含む)に出力しません。したがって、coulddbus-sendを使用してコマンドを送信しても、使用するアドレスがわかりません。ニュースセッションバスインスタンスが使用するアドレスを指定する方法もありません。

dbus-launchによって作成された新しいインスタンスのアドレスを何らかの方法で取得できれば、問題は(理論的には)解決されます。

dbus-daemon

dbus-launchと同様に、dbus-daemonを使用してセッションバスインスタンスを作成できますが、--address=Xフラグを使用してそのアドレスを指定することもできます。 dbus-send --address=Xを使用すると、「接続のオープンに失敗しました[...]」エラーが発生します。解決できたとしても、VLCインスタンスを特定のセッションバスインスタンスにフックする方法がわかりません。ここでの進め方がわかりません。

1
Mossmyr

私自身の問題に対する答えを探している間にあなたの質問を見つけました。 dbus IRCチャンネルの人たちが答えを助けてくれました。

dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListQueuedOwners string:org.mpris.MediaPlayer2.vlc

これにより、ループできる宛先が提供されます。 :1.25:1.26のようにリストされているので、dbus-sendは次のようになります(コロンが必要です!)...

dbus-send --print-reply --dest=:1.25 /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause
dbus-send --print-reply --dest=:1.26 /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause
1
AustinBrock