gpt4 book ai didi

linux - 检测 D-Bus 上的禁止关闭

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:25 32 4
gpt4 key购买 nike

我使用 x86_64 Debian 9 Stretch。我运行 systemd-inhibit cat,然后在另一个控制台中运行 systemctl poweroff。关机正确地被禁止。根据this doc应该发出信号 PrepareForShutdown(false),但我看不到它。我使用 dbus-monitor --system 并使用 python 程序观看 dbus:

#!/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 信号。

最佳答案

Is signal not being emited or I just can't catch it?

不确定。我的猜测是 systemd 仅向已延迟锁定(单播信号发射)的进程发出信号,如 documentation page如果您监听 PrepareForShutdown 而不先获取延迟锁,则会有一些关于竞争条件的非常可怕的警告。

检查这一点的方法是阅读 systemd source code .

My goal is to detect inhibited shutdown by listening D-Bus, how do I do it?

如果我在一个终端中运行 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 时,将禁止关机。它们记录在 the same documentation page 上:

The BlockInhibited and DelayInhibited properties encode what types of locks are currently taken. These fields are a colon separated list of shutdown, sleep, idle, handle-power-key, handle-suspend-key, handle-hibernate-key, handle-lid-switch. The list is basically the union of the What fields of all currently active locks of the specific mode.

关于linux - 检测 D-Bus 上的禁止关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53603740/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com