2017-08-22 8 views
1

にsystemdサービスユニットが障害状態にある場合は、systemctlステータスは事実ことを示していますsystemctlをフォークし、しようとせずにフィールド:Pythonから失敗したサービスのsystemctl Resultをどのように取得しますか?

# 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プログラムをしたいのですが、「起動制限を結果」というの取得出力を解析します。その他のフィールド(Loaded、Activeなど)は、Python dbusライブラリから利用できます。

たとえば、次のコードではsystemctlで表示されるActiveStateのプロパティを取得します(上記の出力では「失敗」と表示されます)。

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

「結果」値は、他の出力の大部分が意味するプロパティではないようです。あなたはhttps://www.freedesktop.org/wiki/Software/systemd/dbus/でドキュメントをチェックすると

答えて

0

は、それがサービスユニットの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) 

は、今では美しく働いています!

関連する問題