セッションバス(ユーザーごとのバス)にDBusサービスがあるとします。サービスは/etc/xdg/autostart/*
ファイルを介して開始される場合もあれば、一部のアプリがよく知られているサービス名を使用しようとするときに開始される場合もあります。いずれにしても、DBusセッションバスがサービスを開始するプロセスであるとしましょう。
そしてユーザーはログアウトします。それでどうなりますか? DBusはアクション可能な[〜#〜] sig [〜#〜] <foo>シグナルをサービスに送信しますか、それともSIGKILL
に制限されますか?ユーザーがログアウトしていることを知る他の方法はありますか?基本的に、subprocess.Popen
およびmultiprocessing
で開始されたサブプロセスを強制終了するなど、実行する必要があるクリーンアップアクションがいくつかあります。
さて、あなたは言う前に、「Popen
とmultiprocessing
は悪です、それらを使用しないでください」、私の現在の実験では、私はnotそれらを使用します。 Python DBusサービスが、全体的なアーキテクチャが何であれ、クリーンアップアクションを実行できるようにするものにフックする方法を理解しようとしています。
何かアドバイス?例はありますか?私の例はGObject.MainLoop
で実行され、Ubuntu Precise(またはQuantal)でPython3を使用していることに注意してください。
次のいずれかを実行できます。
bus = dbus.SessionBus()
bus.call_on_disconnection(your_method_to_do_stuff)
または、org.FreeDesktop.DBus
インターフェイスのNameLost
信号に接続できます。前者は追加の引数を渡すことができず、メソッドは引数としてバス接続オブジェクトのみを受け取ることができます。後者はもう少し複雑ですが、独自の一致の他の引数を渡すことも許可していないようであり、信号自体が送信する引数、この場合はメッセージバスの文字列である引数に制限されています以前に所有していたプロセスに名前を付けます。
一方、プロセスがその後も継続する場合、理論的にはある時点でSIGKILL
も取得する必要があります。
GNOMEとUnityの下で実行することだけに関心がある場合は、 セッションマネージャーDBusインターフェイス にフックできるはずです。これにより、QueryEndSession
およびEndSession
信号を介して「ログアウトしよう」というメッセージが表示されるだけでなく、必要に応じてクリーンアップが完了するまでログアウト/シャットダウンをブロックできます。 EndSessionResponse
経由。
KDEが互換性のあるインターフェースをどの程度実装しているかはわかりません。