发布于 2019-06-18 23:53:21
有各种命令行工具来进行dbus调用;systemd附带了一个名为busctl
的命令行工具。这样您就可以从命令行调用StartTransientUnit
。
语法确实很烦人,但看起来如下(对于一个进程id,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属性,可以增加属性的数量并将其添加到单元中。注意,每个属性至少是三个附加的命令行参数:键、值类型和值。例如,添加一个片属性来自:
… fail 1 PIDs au 1 14460 0
至
… fail 2 PIDs au 1 14460 Slice s whatever.slice 0
^ ^^^^^ ^ ^^^^^^^^^^^^^^
count key type value
键入"s“是字符串。它们的列表可以在D总线规范的“类型系统”一章中找到。
当然,您可以将计数更改为3并添加第三个属性。等。
类似于更多的属性,但这次是隐藏在“PID”属性值中的计数。一个例子应该使它更清楚:
… fail 1 PIDs au 1 14460 0
变成了
… fail 1 PIDs au 2 14460 14461 0
^ ^^^^^
internal count second pid
如果你加上PID 14461和14460。
您可以添加第三,第四等PID以同样的方式。
当然,您可以将其他属性与附加的pids结合起来。请记住,pids的列表是一个属性值,因此它需要保持在一起。不能将pid参数与其他属性混合。正确的方法是改变:
… fail 1 PIDs au 1 14460 0
至:
… fail 2 PIDs au 2 14460 14461 Slice s whatever.slice 0
(顺序并不重要,您可以将片块放在PID块之前)。
签名可以从系统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
。
根据系统d文件 (在“CreateUnit”下面查看),有用的值是fail
和replace
。fail
意味着如果发生冲突,您的作用域将无法启动。replace
意味着系统将摆脱冲突的单元。请注意,这似乎只适用于当前正在启动或计划的单元(它确实说“排队”)--例如,替换不会用相同的名称替换已经运行的作用域。
https://unix.stackexchange.com/questions/525740
复制相似问题