Autostart aplicação gtk com systemd

1

Estou escrevendo um pequeno daemon que registra o nome da janela ativa. A parte relevante é como:

import wnck
import gtk

from plugins import IReporter


class ActiveWindowNameReporter(IReporter):

    export_as = 'active_window_name'

    def report(self):
        name = None

        screen = wnck.screen_get_default()
        screen.force_update()
        while gtk.events_pending():
                gtk.main_iteration()

        if screen:
            active_window = screen.get_active_window()

            if active_window:
                name = active_window.get_name()

        return name

Eu escrevi um arquivo de serviço do usuário systemd simples para isso:

[Unit]
Description=Activity Monitor Service

[Service]
ExecStart=/usr/bin/python /home/me/Projects/monitor/monitor.py

[Install]
WantedBy=graphical.target

No entanto, a execução do serviço falha. No journalctl -r eu posso ver:

Unit actor.service entered failed state.
actor.service: main process exited, code=exited, status=1/FAILURE
ImportError: could not import gtk
import wnck
File "/home/me/Projects/monitor/reporters/active_window_name.py", line 1, in <mod
from reporters import *
File "/home/me/Projects/monitor/monitor.py", line 16, in <module>
Traceback (most recent call last):
detected unhandled Python exception in '/home/tbabej/Projects/actor/actor.py'      
Started Activity Monitor Service.                                                  
Starting Activity Monitor Service...

Parece que a importação do módulo gtk falha porque a sessão não está disponível? Definir a variável XDG_SESSION_ID no script não ajudou.

    
por Enuy 15.03.2014 / 09:09

1 resposta

1

Os serviços do sistema não podem e não devem interagir com as sessões do usuário. A suposição de que sempre existe exatamente uma sessão gráfica nunca foi verdadeira no Unix (o X11 era multiusuário desde o início) e nem sequer é verdade no Windows (após o NT 4.0 ter introduzido os Serviços de Terminal e o XP adicionado a Troca Rápida de Usuário). / p>

Em outras palavras, um serviço do sistema não sabe qual display X11 ele deve usar; não tem as credenciais certas mesmo se você codificar :0 (somente o proprietário da sessão sabe o valor correto de $ XAUTHORITY - sendo que o root não concede nenhum poder mágico); e muitas vezes será iniciado automaticamente antes qualquer display do X11 aparecerá, mesmo se você codificar /home/me/.Xauthority .

Isso significa que scripts como o seu devem ser iniciados dentro da sessão gráfica - através de ~/.config/autostart/*.desktop (a especificação inicial do XDG), ou através de ~/.xprofile (um script de shell regular). p>

# ~/.config/autostart/monitor.desktop

[Desktop Entry]
Name=Activity monitor
Type=Application
Exec=nm-applet
    
por 15.03.2014 / 09:43