systemd:范围与服务

systemd:范围与服务

范围的手册页说:

与服务单元不同,范围单元管理外部创建的进程,并且不会自行分叉进程。

在我的 RHEL 服务器上,我可以看到 gdm 属于 gdm 服务。它的子服务也是如此,gdm-简单-从属gdm-简单-从属已经创建gdm-会话工作者,但这个过程属于一个范围,而不是 gdm 服务。

有鉴于此,“ 是什么意思外部创建流程”的意思,那么服务和范围有什么区别?

对于那些喜欢代码的读者:

# systemctl status gdm
gdm.service - GNOME Display Manager
   Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled)
   Active: active (running) since Sun 2018-03-04 16:27:45 EST; 1 day 3h ago
  Process: 1330 ExecStartPost=/bin/bash -c TERM=linux /usr/bin/clear > /dev/tty1 (code=exited, status=0/SUCCESS)
 Main PID: 1307 (gdm)
   CGroup: /system.slice/gdm.service
           ├─1307 /usr/sbin/gdm
           ├─1331 /usr/libexec/gdm-simple-slave --display-i...
           └─1364 /usr/bin/Xorg :0 -background none -verbos...
# ps -ef|grep 1331
root      1331  1307  0 Mar04 ?    00:00:00 /usr/libexec/gdm-simple-slave...
root      2032  1331  0 Mar04 ?    00:00:00 gdm-session-worker ...
# systemctl status 2032
session-38.scope - Session 38 of user root
   Loaded: loaded (/run/systemd/system/session-38.scope; static)
  Drop-In: /run/systemd/system/session-38.scope.d
           └─90-After-systemd-logind\x2eservice.conf, 90-After-systemd-user-sessions\x2eservice.conf, 90-Description.conf, 90-SendSIGHUP.conf, 90-Slice.conf
   Active: active (running) since Sun 2018-03-04 21:12:08 EST; 22h ago

答案1

外部创建的进程是由以 PID 1 运行的 systemd 守护程序以外的进程生成的进程。

对于范围和服务,systemd 都会创建 cgroup,以便您整体管理其中的进程。(例如,您可以使用systemctl stop它来停止范围并终止其中的所有进程。)

但是有了服务,systemd 就有要运行的命令行,并将在该环境中运行它。

以 gdm-session-worker 为例,这实际上是不可能的,因为它应该由 gdm-simple-slave 生成​​...所以为了仍然为每个 gdm-session-worker 保留一个单独的会话,gdm 仍将与 systemd 通信以要求它创建一个新范围,然后在该新范围内创建该 gdm-session-worker。

我希望这能回答你的问题……你已经找到了systemd 范围 man页面。如果你想更深入地了解 API,你可能需要查看新的控制组接口,不过也许更简单的方法是使用systemd-run --scope命令

相关内容