使用 'ps' 的 init 进程名称输出不一致

cod*_*rus 5 init ps systemd 16.04

我使用的是 Ubuntu 16.04,并且一直在关注 Linux Bible(第 9 版)的“启动和停止”服务章节。我试图找到我拥有(initsystemd)什么类型的 init 守护进程,这要求我找到哪个进程的 PID 为 1。但是,根据我运行命令的方式,我得到了 2 个不同的结果......

webmaster@my-site:~$ ps -p1
  PID TTY          TIME CMD
    1 ?        00:00:29 systemd
webmaster@my-site:~$ ps -F -p1
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root         1     0  0  9420  5336   0 Feb23 ?        00:00:29 /sbin/init
Run Code Online (Sandbox Code Playgroud)

systemd在运行第一个命令后表示PID1,但/sbin/init在运行第二个命令后表示 PID1。

Geo*_*sen 2

                        GRUB(GRand Unified Bootloader)
                                       |                                                          
                                       |
                                       |                                                  
                                       V
                                     Kernel
                                       |
                                Hardware check
                                       |
                            -----------------------
                            |init processes start |
                            -----------------------
                                      /|\
                                     / | \
                            SysVinit   |  systemd
                        init scripts   |
                                    Upstart
Run Code Online (Sandbox Code Playgroud)

让我尝试用上图来解释一下。现在在 Ubuntu 中,它从开始SysVinit,然后Upstart,最后Systemd。它们中的每一个都将处理init启动所有Linux 和 Ubuntu 的进程。

现在Ubuntu正在逐渐远离Upstart和进入Systemd,并且是Ubuntu Xenial上的当前init控制器。该init进程启动所有的事情(或者大多数,因为内核有自己的进程,与 无关init),但是处理或控制该进程的init进程是SysVinitUpstart或 ,Systemd具体取决于您的 Ubuntu 版本。就你而言,它是较新的Systemd。但请记住,您还会看到旧系统的残余,其中诸如 等命令initctl仍在service运行。

因此,为了启动并运行初始系统功能或服务,新的 Ubuntu 现在使用旧版本的systemd替代品。init daemon但为了向后兼容init仍然在后台运行。

根据man ps,传递一个-F标志会导致command arguments被打印出来。所以在这种情况下,命令显示为:

ps -p 1

#Result
PID TTY          TIME CMD
1 ?        00:00:02 systemd
Run Code Online (Sandbox Code Playgroud)

然后查看传递给该命令的参数:

ps -F -p 1

#Result
UID        PID  PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root         1     0  0 46414  6336   1 05:48 ?        00:00:02 /sbin/init splash
Run Code Online (Sandbox Code Playgroud)

所以ps -p 1==>commandps -F -p 1==>arguments passed就可以了。长话短说额外的完整格式,查看与or命令-F相关的更多信息。您看到的是 Ubuntu Xenial 上运行的底层进程。记下TIME :00:00:02,这对于和的两种形式都是相同的。ps -p 1systemdinitsystemdsystemd/sbin/initps

请查看此页面,您就会明白为什么在使用选项/sbin/init时会显示此信息。与运行-FSystemdPID 1 as /sbin/init.

来源:

man ps

https://wiki.ubuntu.com/SystemdForUpstartUsers


use*_*.dz 2

对于 Ubuntu 16.04,默认init值为systemd

~$ ls -l /sbin/init
lrwxrwxrwx 1 root root 20 Oct  3 20:44 /sbin/init -> /lib/systemd/systemd
Run Code Online (Sandbox Code Playgroud)

systemd是真正运行的那个。-F选项使ps打印用于启动它的确切命令行(包括参数)。