我试图从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是正确的调用方法吗?我该怎么称呼它?
答案 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
。 (主要调用似乎是UnitNew
和JobNew
。)
我会承认,对我来说这看起来相当复杂,如果systemd-run
已经存在为你完成这项工作,为什么不使用呢?我要做的唯一改变是消除shell部分并传递一个参数数组而不是一个空格分隔的字符串,类似这样(未经测试):
subprocess.run(['systemd-run', '--on-active', str(time), ' --unit', 'scheduled-message', '--description', message, 'wall', message)