从 Python 启动 systemd 计时器

Start systemd timer from Python

我正在尝试从 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)

我不想使用"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 是正确的调用方法吗?我应该怎么称呼它?

TL;DR:坚持systemd-run :)

我认为 StartTransientUnit 不是很正确的方法 – 你需要创建 两个 瞬态单元,毕竟:计时器单元和服务单元它将开始(稍后将 运行 wall)。也许您可以将 StartTransientUnit 用于计时器,但至少不能用于服务。您还需要设置两个单元所需的所有属性(OnActiveSec= 用于计时器,ExecStart= 用于服务,可能还有更多……)——您可以看到 systemd-run 是如何做到的运行ning busctl monitor org.freedesktop.systemd1 然后在另一个终端做 systemctl run --on-active 1s /bin/true。 (主要调用好像是UnitNewJobNew。)

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

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