user@.service 中文手册

译者:金步国


版权声明

本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。

其他作品

本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:

联系方式

由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。


手册索引 · 指令索引systemd-241

名称

user@.service, user-runtime-dir@.service — 管理用户进程的系统单元

大纲

user@UID.service

user-runtime-dir@UID.service

user-UID.slice

描述

systemd(1) 系统管理器(PID=1)以 user@UID.service 为名称启动用户管理单元实例。 每一个 systemd --user 实例都管理着一个包含该用户所有运行单元的层次结构。 详见 systemd(1) 手册以了解 systemd 单元的一般概念、 systemd.special(1) 手册以了解用于组成系统单元/用户单元的基本层次结构的特殊单元。

每一个 user@UID.service 单元实例都附带着一个 user-runtime-dir@UID.service 系统单元实例, 用于创建用户运行时目录 /run/user/UID , 并在该单元停止时自动将其删除。

用户进程可以由 user@.service 的实例启动,在这种情况下, 在系统的层次结构中,用户进程将成为该单元的一部分。 用户进程也可以在其他地方启动,例如由 sshd(8) 或者像 gdm 这样的显示管理器启动,在这种情况下,将会形成一个 .scope 单元(参见 systemd.scope(5) 手册)。 user@UID.service 与 scope 单元都将被收集在 user-UID.slice 单元之中。

所有 user-UID.slice 单元都收集在 user.slice 单元之下,详见 systemd.special(8) 手册。

针对已登录用户的资源控制

针对已登录用户的资源控制可以在几个不同的层次上进行配置。 正如前文所述,因为 user.slice 包含了所有用户的进程, 所以在此 slice 上施加的资源限制将会作用于全部已登录用户的总体。 通常通过例如 /etc/systemd/system/user.slice.d/resources.conf 这样的配置片段实现。

属于单个已登录用户的全部进程都收集在 user-UID.slice 之下。 针对单个用户的资源限制可以通过此 slice 来实现(通过例如 /etc/systemd/system/user-1000.slice.d/resources.conf 这样的配置片段)。 如果想对每一个已登录用户都施加相同的资源限制,可以通过 user-.slice 单元(剪掉单元名称)的配置片段来实现。例如,配置片段 /etc/systemd/system/user-.slice.d/resources.conf 将会被包含进所有 user-UID.slice 单元中。参见 systemd.unit(5) 以了解单元配置片段的工作原理。

在一个用户登录的同时,将会自动为该用户的登录会话创建一个 .scope 单元(参见前面的小节), 创建 scope 单元的操作可以由 pam_systemd(8) 实施。 此 PAM 模块与 systemd-logind.service(8) 通信以创建会话 scope 单元,并提供对硬件资源的访问。 针对该 scope 单元的资源控制,既可以通过 PAM 模块的配置来实现(详见 pam_systemd(8) 手册)、 也可以通过常规的单元配置片段来实现。不过需要注意的是,后一种方法没有实际意义, 因为该 scope 单元的名称是无法预知的,所以实践中只能通过 PAM 模块的配置来实现。

通常,任何针对单元的资源控制都可以用于 user@UID.service 单元与上文提及的 slice 单元。详见 systemd.resource-control(5) 以了解更多有关资源控制的详情。

例子

例 1. 拥有两个已登录用户的控制组层次结构

$ systemd-cgls
Control group /:
-.slice
├─user.slice
│ ├─user-1000.slice
│ │ ├─user@1000.service
│ │ │ ├─pulseaudio.service
│ │ │ │ └─2386 /usr/bin/pulseaudio --daemonize=no
│ │ │ └─gnome-terminal-server.service
│ │ │   └─init.scope
│ │ │     ├─ 4127 /usr/libexec/gnome-terminal-server
│ │ │     └─ 4198 zsh
│ │ …
│ │ └─session-4.scope
│ │   ├─ 1264 gdm-session-worker [pam/gdm-password]
│ │   ├─ 2339 /usr/bin/gnome-shell
│ │   …
│ │ ├─session-19.scope
│ │   ├─6497 sshd: zbyszek [priv]
│ │   ├─6502 sshd: zbyszek@pts/6
│ │   ├─6509 -zsh
│ │   └─6602 systemd-cgls --no-pager
│ …
│ └─user-1001.slice
│   ├─session-20.scope
│   │ ├─6675 sshd: guest [priv]
│   │ ├─6708 sshd: guest@pts/6
│   │ └─6717 -bash
│   └─user@1001.service
│     ├─init.scope
│     │ ├─6680 /usr/lib/systemd/systemd --user
│     │ └─6688 (sd-pam)
│     └─sleep.service
│       └─6706 /usr/bin/sleep 30
…

UID=1000 的用户通过 gdm (session-4.scope) 与 ssh(1) (session-19.scope) 登录, 同时拥有一个用户管理单元实例(user@1000.service)。 UID=1001 的用户通过 ssh (session-20.scope) 登录, 同时拥有一个用户管理单元实例(user@1001.service)。 这些(叶子)系统单元向上构成了 user-1000.sliceuser-1001.slice 单元,进一步向上又构成了 user.slice 单元。用户单元可见于 user@.service 实例之下(pulseaudio.service, gnome-terminal-server.service, init.scope, sleep.service)。


例 2. 默认用户资源限制

$ systemctl cat user-1000.slice
# /usr/lib/systemd/system/user-.slice.d/10-defaults.conf
# …
[Unit]
Description=User Slice of UID %j
After=systemd-user-sessions.service

[Slice]
TasksMax=33%

user-UID.slice 单元默认不存在单元文件。 只能通过单元配置片段来施加资源限制, 这种方式便于按照标准的单元配置片段作用机制对配置进行替换和扩展(参见第一小节)。


参见

systemd(1), systemd.service(5), systemd.slice(5), systemd.resource-control(5), systemd.exec(5), systemd.special(7), pam(8)