如何从Python获取失败服务的systemctl结果?

时间:2017-08-22 20:30:49

标签: python systemd

如果systemd服务单元处于故障状态,则systemctl状态显示以下事实:

    # 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程序获得“Result:start-limit”字段而不会分支systemctl并尝试解析输出。其他字段(例如Loaded,Active)可从Python dbus库获得。

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

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

看来“结果”值在某种意义上不是属性,而是其他输出的大部分都是。

1 个答案:

答案 0 :(得分:1)

如果您查看https://www.freedesktop.org/wiki/Software/systemd/dbus/处的文档,则说明df.columns = df.columns.str.strip() 属于服务单位对象Result)。

所以,我把它添加到你的代码中:

org.freedesktop.systemd1.Service

现在它工作得非常好!