gpt4 book ai didi

python-3.x - 为什么 systemd 不在 session 总线上发送单元属性更改通知?

转载 作者:行者123 更新时间:2023-12-05 06:07:47 25 4
gpt4 key购买 nike

我在 Python (3.7) 中实现了一个 dbus systemd 监听器,它将监视 systemd 单元的属性更改。在 session dbus 上,它不会收到任何通知。在系统 dbus 上运行的代码会执行预期的操作。

有没有办法在 session 总线上也接收单位更改通知?

我的系统:运行最新版本 Raspberry PI OS 的 Raspberry 4。

这是我创建的服务。

[Unit]
Description = A dummy service

[Service]
Type = simple
ExecStart = /bin/true
RemainAfterExit=yes

我将服务安装到/etc/systemd/system 和 ~/.config/systemd/user 并为系统和用户 session 执行了 daemon-reload。完成后,该服务被称为用户和系统服务。

这是 dummy_listener.py 代码

#!/usr/bin/env python3

# Python version required: >= 3.7 (because of used asyncio API)

"""A simple subscriber/listener for systemd unit signals"""
import sys
import asyncio
from dbus_next.aio import MessageBus
from dbus_next import BusType

class DbusDummyService(): # pylint: disable=no-self-use
"""Asyncio based dummy.service listener"""
async def init(self, bus_type=BusType.SESSION):
"""Register listener callback with dbus bus_type"""
bus = await MessageBus(bus_type=bus_type).connect()
# Get introspection XML
introspection = await bus.introspect('org.freedesktop.systemd1',
'/org/freedesktop/systemd1/unit/dummy_2eservice')
# Select systemd service object
obj = bus.get_proxy_object('org.freedesktop.systemd1',
'/org/freedesktop/systemd1/unit/dummy_2eservice', introspection)
# Get required interfaces
properties_if = obj.get_interface('org.freedesktop.DBus.Properties')
# Monitor service status changes
properties_if.on_properties_changed(self.on_properties_changed_cb)

def on_properties_changed_cb(self, interface_name, changed_props, invalidated_props):
"""Callback expected to be called on unit property changes"""
print(f"Callback invoked for interface {interface_name}:")
print(f" Properties updated")
for prop, val in changed_props.items():
print(f" {prop} set to {val.value}")
print(f" Properties invalidated")
for prop in invalidated_props:
print(f" {prop} invalidated")

async def main(bus_type):
"""Asyncio main"""
# Initialize dbus listener
await DbusDummyService().init(bus_type)
# Run loop forever (waiting for dbus signals)
await asyncio.get_running_loop().create_future()

if __name__ == "__main__":
try:
BUS_TYPE = BusType.SYSTEM if 'sys' in sys.argv[1] else BusType.SESSION
except BaseException:
BUS_TYPE = BusType.SESSION

asyncio.run(main(BUS_TYPE))

监听器在系统dbus上是这样运行的

sudo python3 dummy_lister.py sys

对于 session 总线,它运行在

python3 dummy_lister.py

在一个单独的窗口中,我现在重新启动虚拟服务并期望监听器输出打印件。

对于 session dbus:

systemctl --user restart dummy

对于系统dbus:

sudo systemctl restart dummy

在 session dbus 上,监听器什么也不打印。在系统 dbus 上,我收到了一堆消息。

有什么想法吗?

最佳答案

systemd 不会发送 PropertiesChanged 信号,除非至少有一个客户端订阅了它。您需要调用 Subscribe() method来自/org/freedesktop/systemd1 对象 上的org.freedesktop.systemd1.Manager 接口(interface)。

关于python-3.x - 为什么 systemd 不在 session 总线上发送单元属性更改通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65345512/

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