当使用 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?
答案1
杀死父进程 [...],使其成为守护进程
不,没有。守护进程不与控制终端或登录会话关联。运行的进程nohup
肯定仍然是。毕竟,如果不是这样,体操就没有意义了。忽略控制终端挂起。
当父进程死亡时,内核通常会分配 init [...] 作为其新父进程
不,没有。它分配被标记为子进程收割者的最近的祖先进程,如果没有这样的祖先进程,则回退到进程 #1。世界已经改变。
Upstart、nosh 工具集service-manager
和 systemd 都利用了这一点。这三个项目中的每用户服务管理都涉及本地收割者。
进一步阅读
- https://unix.stackexchange.com/a/177361/5132
- systemd 如何处理托管进程子进程的死亡?
- https://unix.stackexchange.com/a/390089/5132
- 乔纳森·德博因·波拉德 (2018)。
local-reaper
。 nosh 工具集手册页。软件。