управление процессами с помощью python: выполнить службу или скрипт systemd или init.d

Как эффективно и правильно управлять процессами с помощью python. Я хочу запускать такие команды, как:

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

Есть ли для этого какой-либо модуль Python?

Любая помощь будет высоко оценена.


person Arindam Choudhury    schedule 05.08.2015    source источник
comment
вы имеете в виду модуль subprocess или что-то вроде supervisord? Кроме того, вы можете реализовать демоны на чистом Python, например, демон Python и службу systemd   -  person jfs    schedule 07.08.2015
comment
Привет, я ищу что-то вроде этого: code.activestate.com/recipes / , но для Linux.   -  person Arindam Choudhury    schedule 10.08.2015
comment
самым простым решением было бы запустить соответствующие команды (например, systemctl restart <service>) с использованием модуля subprocess, хотя могут быть соответствующие оболочки Python.   -  person jfs    schedule 10.08.2015
comment
Использование подпроцесса не обрабатывает stdout/stderr systemctl. Обычно я не могу контролировать то, что он печатает во время выполнения. Ответ Ариндама - это то, что я искал.   -  person dubmojo    schedule 17.09.2019


Ответы (1)


Я нашел способ, используя интерфейс systemd dbus. Вот код:

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
person Arindam Choudhury    schedule 02.09.2015
comment
Бит аутентификации до сих пор для меня загадка, но он работает! - person dubmojo; 17.09.2019
comment
Это работает отлично! В моем случае я хотел управлять службами через веб-интерфейс, такой как Django/Flask, поэтому аутентификация поначалу вызывала у меня затруднения, но мне удалось решить эту проблему с помощью этого решение на AskUbuntu. Надеюсь, это поможет кому-то! Спасибо Ариндам! - person Redgren Grumbholdt; 25.12.2020