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)