为何Linux孤儿进程未被PID 1收养?与书籍描述不符的疑问
关于孤儿进程收养与systemd的疑问解答
1. init进程在哪里?
在现代Linux发行版中,systemd就是传统意义上的init进程——也就是PID为1的那个systemd进程。你测试中看到的PPID为2754的systemd,是systemd的用户会话实例,而非系统级的init进程。
传统教材提到孤儿进程会被PID1的init收养,但现在systemd引入了用户会话管理机制:当用户登录后,systemd会为该用户启动专属的用户实例(通常以systemd --user形式运行),这个进程会接管该用户会话内的孤儿进程,所以你的测试进程才会被PID为2754的systemd收养,而非PID1的系统级init。
你可以执行ps -p 1 -o comm=来确认,输出结果就是systemd,这就是系统的init进程。
2. 为何存在多个systemd进程?
多个systemd进程的存在源于systemd的分层架构:
- 系统级systemd(PID1):负责启动和管理系统级服务、挂载文件系统、初始化硬件等核心系统任务,是系统启动后第一个运行的进程,以root用户身份运行。
- 用户级systemd(--user实例):每个登录系统的用户,都会启动一个独立的
systemd --user进程,用于管理该用户个人的服务(比如桌面环境组件、用户自启动程序等)。这类进程的PID不是1,而是普通进程ID,你看到的2754就是其中一个用户实例的PID,以对应用户的身份运行。
执行pgrep systemd时,会列出所有名称包含systemd的进程,自然会包含PID1的系统实例,以及各个用户会话的用户实例。你可以用ps aux | grep systemd查看更详细信息,通过用户身份和启动参数区分两类进程。
内容的提问来源于stack exchange,提问作者mНBr
相关产品推荐
相关产品推荐

