从Python启动systemd计时器

时间:2018-05-23 09:42:27

标签: python systemd dbus

我试图从python启动dbus计时器。

目前,我可以通过此脚本启动它:

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)

我不想使用"来电#34;但是尝试使用" 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 :(得分:0)

TL; DR:坚持systemd-run:)

我不认为StartTransientUnit是非常正确的方法 - 毕竟你需要创建两个瞬态单位:计时器单元,以及它将启动的服务单元(这将在以后运行wall。也许你可以使用StartTransientUnit作为计时器,但至少不能用于服务。您还需要设置两个单元所需的所有属性(OnActiveSec=用于计时器,ExecStart=用于服务,可能还需要更多...) - 您可以看到systemd-run如何执行此操作运行busctl monitor org.freedesktop.systemd1,然后在另一个终端中执行systemctl run --on-active 1s /bin/true。 (主要调用似乎是UnitNewJobNew。)

我会承认,对我来说这看起来相当复杂,如果systemd-run已经存在为你完成这项工作,为什么不使用呢?我要做的唯一改变是消除shell部分并传递一个参数数组而不是一个空格分隔的字符串,类似这样(未经测试):

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