1

Я пишу небольшой демон, который записывает имя активного окна. Соответствующая часть выглядит так:

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

Я написал простой системный файл службы пользователя для этого:

[Unit]
Description=Activity Monitor Service

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

[Install]
WantedBy=graphical.target

Однако запустить службу не удается. В journalctl -r я вижу:

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...

Похоже, импорт модуля GTK не удается, потому что сеанс недоступен? Установка переменной XDG_SESSION_ID в скрипте не помогла.

1 ответ1

1

Системные сервисы не могут и не должны взаимодействовать с пользовательскими сеансами. Предположение о том, что всегда есть ровно один графический сеанс, никогда не было верным в Unix (X11 был многопользовательским с самого начала), и даже не верным в Windows (после того, как NT 4.0 представила Terminal Services, а XP добавила Fast User Switching).

Другими словами, системная служба не знает, какой дисплей X11 она должна использовать; не имеет правильных учетных данных, даже если вы жестко закодировали :0 (только владелец сеанса знает правильное значение $ XAUTHORITY - будучи пользователем root не дает никаких магических способностей); и очень часто будет запускаться автоматически до появления любых дисплеев X11, даже если вы жестко закодировали /home/me/.Xauthority .

Это означает, что подобные вам сценарии должны запускаться внутри графического сеанса - либо через ~/.config/autostart/*.desktop (спецификация XDG Autostart), либо через ~/.xprofile (обычный сценарий оболочки).

# ~/.config/autostart/monitor.desktop

[Desktop Entry]
Name=Activity monitor
Type=Application
Exec=nm-applet

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .