Como um serviço de sessão do Python DBus sabe que o usuário está efetuando logout?

4

Digamos que você tenha um serviço DBus no barramento da sessão (o barramento por usuário). Seu serviço pode ser iniciado por meio de um arquivo /etc/xdg/autostart/* ou pode ser iniciado na primeira vez que algum aplicativo tentar usar seu nome de serviço conhecido. De qualquer maneira, digamos que o barramento de sessão DBus é o processo que inicia seu serviço.

E o usuário faz o logout. Então, o que acontece? A DBus envia qualquer SIG acionável SIG < foo > sinais para o seu serviço, ou é estreito para SIGKILL ? Existe alguma outra maneira de saber que o usuário está efetuando logout? Basicamente, eu tenho algumas ações de limpeza que preciso executar, o que inclui a morte de subprocessos iniciados com subprocess.Popen e multiprocessing .

Agora, antes de você dizer " Popen e multiprocessing são maus, não os use", no meu experimento atual, não os os utilizo. Eu só estou tentando descobrir como um serviço Python DBus pode ligar em algo que permite executar ações de limpeza, independentemente da arquitetura geral.

Algum conselho? Algum exemplo? Observe que meu exemplo estará sendo executado em GObject.MainLoop e está usando o Python3 no Ubuntu Precise (ou Quantal).

    
por jderose 14.07.2012 / 19:19

2 respostas

4

Você pode fazer algo assim:

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

Ou você pode se conectar ao sinal NameLost na interface org.FreeDesktop.DBus . O primeiro não permite que você passe argumentos adicionais, e seu método só pode pegar o próprio objeto de conexão de barramento como um argumento. O último é um pouco mais complicado, mas não parece permitir a passagem em outros argumentos de sua própria vontade, e você está limitado a pegar os argumentos que o próprio sinal envia, que neste caso é uma string do barramento de mensagens. nomeie seu processo anteriormente de propriedade.

Por outro lado, se o seu processo permanecer depois disso, você deve, teoricamente, obter um SIGKILL em algum momento.

    
por dobey 14.07.2012 / 21:31
4

Se você só se preocupa com a execução sob o GNOME & amp; Unity você deve ser capaz de conectar-se ao gerenciador de sessão da interface DBus . Isso não só dá a você uma mensagem "prestes a sair" através dos sinais QueryEndSession e EndSession , mas também permite que você bloqueie o logout / shutdown até que esteja pronto para limpar, se desejar, via EndSessionResponse . / p>

Não sei até que ponto o KDE implementa uma interface compatível.

    
por RAOF 15.07.2012 / 10:53