Bug#996911: systemd: dbus signal JobRemoved for a failed job is 'done' instead of 'failed'
Alexandre Rossi
niol at zincube.net
Thu Oct 21 09:11:18 BST 2021
Hi,
> > I usually recommend to use Type=notify or if that is not possible, I
> > think forking is better then simple for most cases.
>
> See the difference:
>
> # systemctl cat fail.service
> # /etc/systemd/system/fail.service
> [Unit]
> Description=fail
>
> [Service]
> Type=simple
> ExecStart=/bin/false
>
> # systemctl start fail.service
>
> # echo $?
> 0
Thank you very much for the explaination. I know understand my confusion
between the Job result and Unit states.
My test program becomes:
--
#!/usr/bin/python3
from gi.repository import GLib
import dbus
import dbus.mainloop.glib
def subscribe():
sysbus = dbus.SystemBus()
systemd1 = sysbus.get_object('org.freedesktop.systemd1',
'/org/freedesktop/systemd1')
def get_unit_state(unit_name):
unit = manager.GetUnit(unit_name)
unit_if = sysbus.get_object('org.freedesktop.systemd1', unit)
unit_props = dbus.Interface(unit_if, 'org.freedesktop.DBus.Properties')
print('Unit %s: ActiveState=%s, SubState=%s'
% (unit,
unit_props.Get('org.freedesktop.systemd1.Unit', 'ActiveState'),
unit_props.Get('org.freedesktop.systemd1.Unit', 'SubState')))
def systemd_event_cb(pid, jobid, unit, result):
print('received event for unit %s with result %s'
% (unit, result))
get_unit_state(unit)
print('and some time later')
GLib.timeout_add(1000, get_unit_state, unit)
systemd1.connect_to_signal('JobRemoved', systemd_event_cb)
manager = dbus.Interface(systemd1,
'org.freedesktop.systemd1.Manager')
manager.Subscribe()
GLib.timeout_add(100, subscribe)
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
loop = GLib.MainLoop()
loop.run()
--
Now the output is:
--
received event for unit fail.service with result done
Unit /org/freedesktop/systemd1/unit/fail_2eservice: ActiveState=failed, SubState=failed
and some time later
Unit /org/freedesktop/systemd1/unit/fail_2eservice: ActiveState=failed, SubState=failed
received event for unit davmail.service with result done
Unit /org/freedesktop/systemd1/unit/davmail_2eservice: ActiveState=active, SubState=running
and some time later
Unit /org/freedesktop/systemd1/unit/davmail_2eservice: ActiveState=failed, SubState=failed
--
I can use Unit ActiveState to assess Unit failure but need to wait a bit for
some services as the failed state is not immediate.
Also I'll try to fix davmail following your advice.
Thanks,
Alex
More information about the Pkg-systemd-maintainers
mailing list