Search code examples
pythoninitupstartsystemdprocess-management

process management with python: execute service or systemd or init.d script


How to efficiently and correctly manage processes with python. I want to run commands like:

/etc/init.d/daemon stop
service daemon start
systemctl restart daemon

Is there any python module available for this?

Any help will be highly appreciated.


Solution

  • I found a way using systemd dbus interface. Here is the code:

    import dbus
    import subprocess
    import os
    import sys
    import time
    
    SYSTEMD_BUSNAME = 'org.freedesktop.systemd1'
    SYSTEMD_PATH = '/org/freedesktop/systemd1'
    SYSTEMD_MANAGER_INTERFACE = 'org.freedesktop.systemd1.Manager'
    SYSTEMD_UNIT_INTERFACE = 'org.freedesktop.systemd1.Unit'
    
    bus = dbus.SystemBus()
    
    proxy = bus.get_object('org.freedesktop.PolicyKit1', '/org/freedesktop/PolicyKit1/Authority')
    authority = dbus.Interface(proxy, dbus_interface='org.freedesktop.PolicyKit1.Authority')
    system_bus_name = bus.get_unique_name()
    
    subject = ('system-bus-name', {'name' : system_bus_name})
    action_id = 'org.freedesktop.systemd1.manage-units'
    details = {}
    flags = 1            # AllowUserInteraction flag
    cancellation_id = '' # No cancellation id
    
    result = authority.CheckAuthorization(subject, action_id, details, flags, cancellation_id)
    
    if result[1] != 0:
        sys.exit("Need administrative privilege")
    
    systemd_object = bus.get_object(SYSTEMD_BUSNAME, SYSTEMD_PATH)
    systemd_manager = dbus.Interface(systemd_object, SYSTEMD_MANAGER_INTERFACE)
    
    unit = systemd_manager.GetUnit('cups.service')
    unit_object = bus.get_object(SYSTEMD_BUSNAME, unit)
    #unit_interface = dbus.Interface(unit_object, SYSTEMD_UNIT_INTERFACE)
    
    #unit_interface.Stop('replace')
    systemd_manager.StartUnit('cups.service', 'replace')
    
    while list(systemd_manager.ListJobs()):
        time.sleep(2)
        print 'there are pending jobs, lets wait for them to finish.'
    
    prop_unit = dbus.Interface(unit_object, 'org.freedesktop.DBus.Properties')
    
    active_state = prop_unit.Get('org.freedesktop.systemd1.Unit', 'ActiveState')
    
    sub_state = prop_unit.Get('org.freedesktop.systemd1.Unit', 'SubState')
    
    print active_state, sub_state