进一步阅读

进一步阅读

当使用 systemd 用户实例 ( systemd --user) 时,每个用户创建的守护进程都归该实例所有。例如:

  1. 让我们创建一个守护进程:nohup sleep 100 0<&- &>/dev/null &。它有PID 12549。杀死父终端进程(或直接杀死 shell),使其成为守护进程
  2. 该进程的新父进程是 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 都利用了这一点。这三个项目中的每用户服务管理都涉及本地收割者。

进一步阅读

相关内容