web-dev-qa-db-ja.com

Python DBusセッションサービスは、ユーザーがログアウトしていることをどのように認識しますか?

セッションバス(ユーザーごとのバス)にDBusサービスがあるとします。サービスは/etc/xdg/autostart/*ファイルを介して開始される場合もあれば、一部のアプリがよく知られているサービス名を使用しようとするときに開始される場合もあります。いずれにしても、DBusセッションバスがサービスを開始するプロセスであるとしましょう。

そしてユーザーはログアウトします。それでどうなりますか? DBusはアクション可能な[〜#〜] sig [〜#〜] <foo>シグナルをサービスに送信しますか、それともSIGKILLに制限されますか?ユーザーがログアウトしていることを知る他の方法はありますか?基本的に、subprocess.Popenおよびmultiprocessingで開始されたサブプロセスを強制終了するなど、実行する必要があるクリーンアップアクションがいくつかあります。

さて、あなたは言う前に、「Popenmultiprocessingは悪です、それらを使用しないでください」、私の現在の実験では、私はnotそれらを使用します。 Python DBusサービスが、全体的なアーキテクチャが何であれ、クリーンアップアクションを実行できるようにするものにフックする方法を理解しようとしています。

何かアドバイス?例はありますか?私の例はGObject.MainLoopで実行され、Ubuntu Precise(またはQuantal)でPython3を使用していることに注意してください。

4
jderose

次のいずれかを実行できます。

bus = dbus.SessionBus()
bus.call_on_disconnection(your_method_to_do_stuff)

または、org.FreeDesktop.DBusインターフェイスのNameLost信号に接続できます。前者は追加の引数を渡すことができず、メソッドは引数としてバス接続オブジェクトのみを受け取ることができます。後者はもう少し複雑ですが、独自の一致の他の引数を渡すことも許可していないようであり、信号自体が送信する引数、この場合はメッセージバスの文字列である引数に制限されています以前に所有していたプロセスに名前を付けます。

一方、プロセスがその後も継続する場合、理論的にはある時点でSIGKILLも取得する必要があります。

4
dobey

GNOMEとUnityの下で実行することだけに関心がある場合は、 セッションマネージャーDBusインターフェイス にフックできるはずです。これにより、QueryEndSessionおよびEndSession信号を介して「ログアウトしよう」というメッセージが表示されるだけでなく、必要に応じてクリーンアップが完了するまでログアウト/シャットダウンをブロックできます。 EndSessionResponse経由。

KDEが互換性のあるインターフェースをどの程度実装しているかはわかりません。

4
RAOF