【问题标题】:How do you get the systemctl Result for a failed service from Python?如何从 Python 获取失败服务的 systemctl 结果?
【发布时间】:2018-01-31 06:15:59
【问题描述】:

如果 systemd 服务单元处于故障状态,systemctl status 会显示这一事实:

    # systemctl status myservice
    ● myservice.service - Important Crash Prone service (myservice)
       Loaded: loaded (/etc/systemd/system/myservice.service; enabled; vendor preset: disabled)
       Active: failed (Result: start-limit) since Tue 2017-08-22 20:04:13 UTC; 3s ago
      Process: 31108 ExecStart=/bin/myservice (code=dumped, signal=ABRT)
     Main PID: 31108 (code=dumped, signal=ABRT)

我想让 Python 程序在不分叉 systemctl 并尝试解析输出的情况下获取“结果:开始限制”字段。其他字段(例如 Loaded、Active)可从 Python dbus 库中获得。

例如,以下代码获取ActiveState 属性,该属性由systemctl 在“Active:”之后显示(上面输出中的单词“failed”)。

from dbus import Interface, SystemBus, SessionBus
bus = SystemBus()
systemd = bus.get_object('org.freedesktop.systemd1',
                         '/org/freedesktop/systemd1')

manager = Interface(systemd, dbus_interface='org.freedesktop.systemd1.Manager')

myservice_unit = manager.LoadUnit('myservice.service')

myservice_proxy = bus.get_object('org.freedesktop.systemd1', str(myservice_unit))

myservice = Interface(myservice_proxy, 
dbus_interface='org.freedesktop.systemd1.Unit')

prop = 'ActiveState'
value = myservice_proxy.Get('org.freedesktop.systemd1.Unit',
                            prop,
                            dbus_interface='org.freedesktop.DBus.Properties')
print("{} is: {}".format(prop, value))

看起来“结果”值不是一个属性,就像其他大部分输出一样。

【问题讨论】:

    标签: python systemd


    【解决方案1】:

    如果您查看https://www.freedesktop.org/wiki/Software/systemd/dbus/ 的文档,它会解释Result服务单元对象 (org.freedesktop.systemd1.Service) 的一部分。

    所以,我将它添加到您的代码中:

    if value == 'failed':
        result_prop = 'Result'
        result = myservice_proxy.Get('org.freedesktop.systemd1.Service',
                                     result_prop,
                                     dbus_interface='org.freedesktop.DBus.Properties')
        print(result)
    

    现在它运行良好!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-31
      • 2012-08-29
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 2016-06-09
      • 2020-08-28
      • 2023-03-05
      相关资源
      最近更新 更多