Обнаружить запрещенное отключение на D-Bus - PullRequest
0 голосов
/ 04 декабря 2018

Я использую x86_64 Debian 9 Stretch.Я запускаю systemd-inhibit cat, а затем в другой консоли systemctl poweroff.Отключение корректно блокируется.Согласно этот документ сигнал PrepareForShutdown(false) должен излучаться, но я его не вижу.Я смотрю dbus с dbus-monitor --system и использую программу на python:

#!/usr/bin/env python

import dbus
import gobject
from dbus.mainloop.glib import DBusGMainLoop

def handle(*args):
    print "PrepareForShutdown %s" % (args)

DBusGMainLoop(set_as_default=True)     # integrate into gobject main loop
bus = dbus.SystemBus()                 # connect to system wide dbus
bus.add_signal_receiver(               # define the signal to listen to
    handle,                            # callback function
    'PrepareForShutdown',              # signal name
    'org.freedesktop.login1.Manager',  # interface
    'org.freedesktop.login1'           # bus name
)

loop = gobject.MainLoop()
loop.run()

Программа ничего не печатает.dbus-monitor выводит несколько непонятных сообщений (похоже, что-то вызывает ListInhibitors).

Сигнал не излучается или я просто не могу его уловить?Моя цель - обнаружить запрещенное отключение, прослушивая D-Bus, как мне это сделать?

РЕДАКТИРОВАТЬ: оказалось, когда используется задержка без задержки, запрос на отключение просто сбрасывается, сигнал не срабатывает.Но если я использую блокировку задержки через systemd-inhibit --mode=delay --what=shutdown cat, то сигнал PrepareForShutdown срабатывает.

1 Ответ

0 голосов
/ 04 декабря 2018

Сигнал не излучается или я просто не могу его уловить?

Не уверен.Я полагаю, что systemd посылает сигнал только процессам, которые заблокированы с задержкой (передача одноадресного сигнала), поскольку на странице документации есть довольно ужасные предупреждения о состоянии гонки, если вы слушаете PrepareForShutdown без сначала с блокировкой задержки.

Чтобы проверить это, прочитайте системный исходный код .

Моя цель -Как обнаружить это, чтобы обнаружить запрещенное отключение при прослушивании D-Bus?

Если я запускаю sudo dbus-monitor --system на одном терминале, а затем запускаю systemd-inhibit cat на другом, я вижу следующее излучение сигнала:

signal time=1543917703.712998 sender=:1.9 -> destination=(null destination) serial=1150 path=/org/freedesktop/login1; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
   string "org.freedesktop.login1.Manager"
   array [
      dict entry(
         string "BlockInhibited"
         variant             string "shutdown:sleep:idle:handle-power-key:handle-suspend-key:handle-hibernate-key:handle-lid-switch"
      )
   ]
   array [
   ]

Следовательно, вы можете наблюдать изменения свойств объекта /org/freedesktop/login1, предоставляемого службой org.freedesktop.login1, и видеть, когда изменяются его свойства BlockInhibited или DelayInhibited.Отключение запрещено, если любое из этих свойств содержит shutdown.Они задокументированы на той же странице документации :

Свойства BlockInhibited и DelayInhibited определяют, какие типы блокировок используются в настоящее время.Эти поля представляют собой разделенный двоеточиями список shutdown, sleep, idle, handle-power-key, handle-suspend-key, handle-hibernate-key, handle-lid-switch.Этот список представляет собой объединение полей What всех текущих активных блокировок определенного режима.

...