cod*_*rus 5 init ps systemd 16.04
我使用的是 Ubuntu 16.04,并且一直在关注 Linux Bible(第 9 版)的“启动和停止”服务章节。我试图找到我拥有(init或systemd)什么类型的 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。
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进程是SysVinit、Upstart或 ,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==>command和ps -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
对于 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打印用于启动它的确切命令行(包括参数)。
| 归档时间: |
|
| 查看次数: |
466 次 |
| 最近记录: |