Запустить системный таймер из Python - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь запустить таймер dbus из python.

На данный момент я смог запустить его через этот скрипт:

import dbus
from subprocess import call

def scheduleWall( time, message ):
   call(['systemd-run --on-active='+str(time) +' --unit=scheduled-message --description="'+ message +'" wall "'+ message +'"'], shell=True)

Я бы не хотел использовать"call", но попробуйте использовать "StartTransientUnit", но я не смог понять формат вызова вообще!Я довольно плохо знаком с dbus и python.

def scheduleWall( time, message ):

  try:
    bus = dbus.SystemBus()
    systemd1 = bus.get_object("org.freedesktop.systemd1"," /org/freedesktop/systemd1")
    manager = dbus.Interface(systemd1, 'org.freedesktop.systemd1.Manager')
    obj = manager.StartTransientUnit('scheduled-message.timer','fail',[????],[????])
  except:
    pass        

Является ли startTransientUnit правильным методом для вызова?как мне это назвать?

1 Ответ

0 голосов
/ 31 мая 2018

TL; DR: придерживаться systemd-run:)

Я не думаю, что StartTransientUnit - это совершенно правильный метод - в конце концов, вам нужно создать две переходные единицы: блок таймера и сервисный блок, который он запустит (который запустится wall позже).Возможно, вы можете использовать StartTransientUnit для таймера, но, по крайней мере, не для службы.Вам также нужно установить все свойства, которые нужны двум устройствам (OnActiveSec= для таймера, ExecStart= для службы, возможно, еще немного ...) - вы можете увидеть, как systemd-run делает это, запустив busctl monitor org.freedesktop.systemd1, а затемделать systemctl run --on-active 1s /bin/true в другом терминале.(Основные вызовы, похоже, UnitNew и JobNew.)

Я признаю, мне это кажется довольно сложным, и если systemd-run уже существует, чтобы выполнить работу за вас, почему бы и нетиспользуй это?Единственное изменение, которое я хотел бы сделать, это исключить часть оболочки и передать массив аргументов вместо одной строки, разделенной пробелом, с чем-то вроде этого (не проверено):

subprocess.run(['systemd-run', '--on-active', str(time), ' --unit', 'scheduled-message', '--description', message, 'wall', message)
...