我一直有这样的印象:守护进程是系统范围的服务,由“init”系统运行、拥有、控制和维护。然而,我最近了解到一些守护进程服务(例如pulseaudio,如此解释)很好的答案)作为“每用户”服务运行,由个人用户拥有和控制。
这是什么时候开始的?这是新事物吗?init 系统对“每个用户”守护进程的明确支持是 systemd 引入的吗,还是其他 init 系统也存在这种现象?
答案1
当然,基本机制与它们本身fork
一样古老。wait
自 20 世纪 90 年代以来,用于执行此类操作的便捷命令行工具就已出现。它绝不从 systemd 开始。
Daniel J. Bernstein 著名的 daemontools 软件包可以由想要管理自己的服务集的用户使用,而无需超级用户访问权限。用户可以很高兴地设置一个扫描目录并svscan
与之对抗。唯一缺少的部分,只需要由管理员编写,是svscan
自动为用户运行的基础设施,这当然只是一个系统服务,它会放弃特权并svscan
以适当的用户身份运行。
daemontools 系列中的所有其他工具集也是如此,从 Laurent Bercot 的 s6 到 Wayne Marshall 的 perp。
提供开箱即用的此类基础设施的服务管理工具集,而不是期望系统管理员从头开始手动设置此类服务,主要是从 Upstart 开始的,它的init
程序有一个“会话初始化”模式,这不是相当每个用户。
发射代理MacOS 上有类似的想法,尽管launchd
与 Mach 强耦合。
systemd 是后来出现的。它可以在每用户模式下运行,系统范围的服务管理器根据需要为每个用户实例化一个模板服务单元(通过 PAM 插件、桌面总线和“登录”守护进程的某种复杂组合) ),运行该systemd
程序的另一个实例。
其他提供此功能的工具集包括 nosh 工具集。
进一步阅读
- “会话初始化”。新贵食谱。乌班图。
- 詹姆斯·亨特、斯特凡·格雷伯、德米特里·莱德科夫和史蒂夫·兰加塞克 (2012-11-12)。Ubuntu Raring 新贵用户会话。乌班图。
- 内森·威利斯 (2013-04-17)。用户会话新贵。 LWN。
- 乔纳森·德博因·波拉德 (2016)。 ”每用户系统服务”。 小吃指南。软件。 jdebp.eu。
- 乔纳森·德博因·波拉德 (2016)。 ”每用户的用户服务”。 小吃指南。软件。 jdebp.eu。
- 无需 root 访问权限即可创建和管理 Upstart 服务
- https://unix.stackexchange.com/a/407863/5132
答案2
这一直都是可能的。
要创建init
(进程1),请成为父进程。你所要做的就是分叉然后死亡。如果父进程死亡,init
则将收养孤儿。
取消货币化的另一部分是关闭 stdin/stdout/stderr,或者至少断开与终端的连接。
这些都不会改变进程的所有者用户。只有具有 CAP_SETUID (root) 能力的进程才能执行此操作。允许进程所有者通过孤立进程进行更改将使安全性变得毫无用处。
至于为什么。我不知道。