AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 525740
Accepted
derobert
derobert
Asked: 2019-06-19 15:53:21 +0800 CST2019-06-19 15:53:21 +0800 CST 2019-06-19 15:53:21 +0800 CST

如何从命令行为已存在的进程创建 systemd 范围?

  • 772

我有一台运行 cgroups v2(统一)层次结构的机器,因此 systemd 负责管理所有 cgroups 和委托给 systemd 用户实例的工作。我想对一组进程执行资源控制,所以我需要将它们放在一个单元中——大概是一个systemd 范围。

通常,systemd-run会这样做——但不幸的是,这些进程已经在运行,我不想重新启动它们。

如何从现有流程中创建systemd 范围?控制组接口文档告诉我这是可能的,但我无法从命令行找到方法。systemctl两者似乎都systemd-run无法做到这一点。

有没有办法从命令行?如果重要,我正在运行 systemd v241。

linux systemd
  • 1 1 个回答
  • 1706 Views

1 个回答

  • Voted
  1. Best Answer
    derobert
    2019-06-19T15:53:21+08:002019-06-19T15:53:21+08:00

    有多种命令行工具可以进行 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 属性添加到单元中,您需要增加属性的数量并添加它。请注意,每个属性至少是三个附加的命令行参数:键、值类型和值。例如,添加 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 并添加第三个属性。等等。

    更多 pid

    类似于更多属性,但这次是隐藏在“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 块放在 PIDs 块之前)。

    签名从哪里来?

    签名可以从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 不会用相同的名称替换已经运行的范围。

    • 11

相关问题

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve