使用 systemd 用户实例 ( systemd --user
) 时,每个用户创建的守护进程都归该实例所有。例如:
- 让我们创建一个守护进程:
nohup sleep 100 0<&- &>/dev/null &
. 它有 PID12549
。杀死父终端进程(或直接杀死shell),使其成为守护进程 该进程的新父进程是 systemd 用户实例:
UID PID PPID C STIME TTY TIME CMD phylliade 12549 20280 0 17:21 ? 00:00:00 sleep 100 phylliade 20280 1 0 09:23 ? 00:00:00 /usr/lib/systemd/systemd --user
那么,这是怎么回事呢?当一个进程的父进程死亡时,内核通常将 init(这里是主 systemd)分配为其新的父进程;系统 systemd 然后将守护进程分配给用户 systemd 吗?
不,它没有。守护进程与控制终端或登录会话无关。一个运行通过的进程
nohup
肯定仍然是。毕竟,如果不是这样,那么无视控制终端挂断的体操就没有意义了。不,它没有。它分配最近的被标记为子进程收割者的祖先进程,如果没有这样的祖先进程,则回退到进程#1。世界变了。
Upstart、nosh 工具集
service-manager
和 systemd 都使用了这个。这三个中的每用户服务管理都涉及本地收割者。进一步阅读
local-reaper
. nosh 工具集手册页。软件。