有多种命令行工具可以进行dbus调用;systemd附带一个称为busctl
。因此,您可以StartTransientUnit
从命令行调用。
语法令人讨厌,但它看起来像这样(对于一个进程标识14460):
busctl call --user org.freedesktop.systemd1 /org/freedesktop/systemd1 \
org.freedesktop.systemd1.Manager StartTransientUnit 'ssa(sv)a(sa(sv))' \
'SCOPE-NAME.scope' fail 1 PIDs au 1 14460 0
这是绝对不透明的(并且花了一些力气才能做到正确,并最终dbus-monitor
用来查看systemd-run
它是怎么做的-尽管仅在系统管理器上systemd-run --user
似乎没有通过dbus进行)。因此,逐个参数进行解释:
busctl call --user # use user session dbus, not system
org.freedesktop.systemd1 # dbus service name
/org/freedesktop/systemd1 # dbus object in that service
org.freedesktop.systemd1.Manager # interface name in that service
StartTransientUnit # method we're going to call
'ssa(sv)a(sa(sv))' # signature of method, see below
'SCOPE-NAME.scope' # first argument, name of scope
fail # second argument, how to handle conflicts (see below)
1 # start of third argument, number of systemd properties for unit
PIDs # name of first property
au # data type of first property, (a)rray [aka list] of (u)nsigned integers
1 # count of array — that is, number of pids
14460 # first pid
0 # fourth argument: array size=0 (unused parameter)
添加到命令
要将另一个systemd属性添加到单元,您需要增加属性数量并添加它。请注意,每个属性至少是三个附加的命令行参数:键,值类型和值。例如,添加Slice属性将来自:
… fail 1 PIDs au 1 14460 0
到
… fail 2 PIDs au 1 14460 Slice s whatever.slice 0
^ ^^^^^ ^ ^^^^^^^^^^^^^^
count key type value
类型“ s”是字符串。它们的列表可以在D-Bus规范的“类型系统”一章中找到。
您当然可以将计数更改为3并添加第三个属性。ETC。
与更多属性类似,但是这次是“ PIDs”属性值中所包含的计数。一个例子应该使它更清楚:
… fail 1 PIDs au 1 14460 0
变成
… fail 1 PIDs au 2 14460 14461 0
^ ^^^^^
internal count second pid
如果您添加PID 14461和14460。
您可以用相同的方法添加第三个,第四个等PID。
您当然可以将其他属性与其他pid结合使用。只需记住,pids列表是一个属性值,因此它需要保持在一起。您不能将pid参数与其他属性混合使用。正确的方法是更改:
… fail 1 PIDs au 1 14460 0
到:
… fail 2 PIDs au 2 14460 14461 Slice s whatever.slice 0
(顺序无关紧要,您可以将Slice块放在PID块之前)。
签名可以从systemd dbus API文档获得,或者更容易地通过使用dbus内省获得:
$ busctl introspect org.freedesktop.systemd1 /org/freedesktop/systemd1 \
org.freedesktop.systemd1.Manager | grep1 StartTransientUnit
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.StartTransientUnit method ssa(sv)a(sa(sv)) o -
(有关grep1
,请参见https://unix.stackexchange.com/a/279518)
列出了很多方法和dbus属性,这里有180多种。因此,请不要忽略grep
。
根据systemd文档(在“ CreateUnit”下查找),有用的值为fail
和replace
。fail
意味着如果发生冲突,您的示波器将无法启动。replace
意味着systemd将摆脱冲突的单元。请注意,这似乎仅适用于当前正在启动或计划运行的设备(它确实说“已排队”),例如,replace不会用相同的名称替换已经在运行的示波器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句