我在 Ubuntu 16.04 上,一直在遵循《Linux 圣经》(第 9 版)的“启动和停止”服务章节。我试图找出我拥有的 init 守护进程的类型(init
或systemd
),这需要我找到哪个进程的 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
systemd
运行第一个命令后,它说的是 PID1,但/sbin/init
运行第二个命令后,它说的是 PID1。
答案1
GRUB(GRand Unified Bootloader)
|
|
|
V
Kernel
|
Hardware check
|
-----------------------
|init processes start |
-----------------------
/|\
/ | \
SysVinit | systemd
init scripts |
Upstart
让我试着解释一下图表以上。现在在 Ubuntu 中,它以 开始SysVinit
,然后是Upstart
,最后是Systemd
。这些中的每一个都将处理这个init
过程开始一切关于 Linux 和 Ubuntu 的一般信息。
现在,Ubuntu 正在逐渐从Upstart
和 转变为 和 ,它是Ubuntu Xenial 上的Systemd
当前控制器。进程启动所有事物(或大多数事物,因为内核有自己的与 无关的进程),但处理或控制该进程的是、或 ,具体取决于您的 Ubuntu 版本。在您的情况下,它是较新的。但请记住,您还会看到旧系统的残余,其中、等命令仍然有效。init
init
init
init
SysVinit
Upstart
Systemd
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
然后看到参数传递给该命令:
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
因此ps -p 1
==> command
,并且ps -F -p 1
==> arguments passed
。长话短说, Extra 完整格式,查看与或命令-F
相关的更多信息。您看到的是Ubuntu Xenial 上运行的底层进程。请注意ps -p 1
systemd
init
systemd
时间:00:00:02,这对于的两种形式中的systemd
和都是相同的。/sbin/init
ps
请看看这个页并且您将看到为什么在使用选项/sbin/init
时会出现。运行。-F
Systemd
PID 1 as /sbin/init
来源:
man ps
答案2
对于 Ubuntu 16.04,默认init
值为systemd
~$ ls -l /sbin/init
lrwxrwxrwx 1 root root 20 Oct 3 20:44 /sbin/init -> /lib/systemd/systemd
systemd
是真正正在运行的。-F
选项使ps
打印用于启动它的确切命令行(包括参数)。