从 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
。 (主要调用好像是UnitNew
和JobNew
。)
我承认,对我来说这似乎相当复杂,如果 systemd-run
已经存在可以为您完成这项工作,为什么不使用它呢?我要做的唯一改变是消除 shell 部分并传递一个参数数组而不是单个 space 分隔的字符串,像这样(未经测试):
subprocess.run(['systemd-run', '--on-active', str(time), ' --unit', 'scheduled-message', '--description', message, 'wall', message)
我正在尝试从 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
。 (主要调用好像是UnitNew
和JobNew
。)
我承认,对我来说这似乎相当复杂,如果 systemd-run
已经存在可以为您完成这项工作,为什么不使用它呢?我要做的唯一改变是消除 shell 部分并传递一个参数数组而不是单个 space 分隔的字符串,像这样(未经测试):
subprocess.run(['systemd-run', '--on-active', str(time), ' --unit', 'scheduled-message', '--description', message, 'wall', message)