在 Ubuntu 中,是否有一个命令可以显示所有自动启动服务的列表?

在 Ubuntu 中,是否有一个命令可以显示所有自动启动服务的列表?

在 Ubuntu 中,

  1. 是否有命令可以显示所有自动启动服务的列表?
  2. 是否有命令可以检查服务是否在启动时自动启动?

我用 Google 和 IRC 查找过,但找不到答案。也许 Ubuntu 中没有这样的命令。一开始,我以为所有自动启动的服务都会在 下/etc/rc2.d/,但我错了。有些服务只在 下配置/etc/init/*.conf。然后我尝试了该工具(手动安装),它并不总是有效。例如,它给出了从 开始自动启动的chkconfig错误结果。mongodb/etc/init/mongodb.conf

service --status-all并且initctl list只能告诉服务的当前状态而不是自动启动状态。update-rc.d是一个用于更改自动启动状态而不是显示状态的命令。

如果没有回答我的问题,我只是想知道为什么在 Ubuntu 中检查自动启动服务如此困难。

答案1

Ubuntu 使用Upstart而不是传统的init系统。Upstart 比 init 更强大,但比 稍微复杂一些init

相比之下,Upstart 是基于事件的。“事件”可以是“启动”之类的东西……也可以是更具体的,比如“网络现在可以使用”。您可以指定哪些脚本依赖于哪些事件。只要有 CPU 可用,任何不等待事件的脚本都可以运行。

这种基于事件的系统还有另一个优势:理论上,即使在系统启动并运行后,您也可以使用它。Upstart 最终将接管诸如插入外部设备(如拇指驱动器)等任务(目前由 udev 和 hal 处理),或在特定时间运行程序(目前由 cron 处理)。

你现在应该知道,一个已死的守护进程(在启动时不会运行)可能还活着并且由于某个事件而启动。

Ubuntu 有 /etc/init(用于 Upstart)和 /etc/init.d(用于旧的 SysV 文件)。其中的一些文件是尚未迁移的常规 SysV Init 脚本。但一些已迁移的服务保留了从 /etc/init.d 到 /lib/init/upstart-job 的链接。如果您运行其中一个,它会起作用,但它会先打印一个警告:

不要通过 /etc/init.d 调用 init 脚本,而是使用 service(8) 实用程序,例如service mysql restart

由于您尝试调用的脚本已转换为 Upstart 作业,您也可以使用 restart(8) 实用程序,例如 restart mysql。

在 Upstart 机器上,init 来自 upstart。Upstart 的 init 不会运行调用特定运行级别脚本的主 rc 脚本,而是从其作业目录中获取作业。

现在我们知道没有简单的方法来列出自动启动守护进程,您应该列出所有守护进程并逐个检查。守护进程可能由initupstart甚至由稍后的事件启动。 获取此列表的最简单方法是在 shell 中运行此命令:

initctl show-config

输出如下所示:

...
hostname
  start on startup
udevtrigger
  start on ((startup and started udev) and not-container)
tty2
  start on (runlevel [23] and ((not-container or container CONTAINER=lxc) or container CONTAINER=lxc-libvirt))
...

有些项目(比如第一个)非常简单,hostname在启动时启动。但其他项目可能看起来更复杂。(但幸运的是,人类可读 :-) )

答案2

实际上,所有服务都仅存在于 /etc/init.d 下:

rc0.d contains the services which runs in runlevel 0
rc1.d contains the services which runs in runlevel 1
rc2.d contains the services which runs in runlevel 2
rc3.d contains the services which runs in runlevel 3
rc4.d contains the services which runs in runlevel 4
rc5.d contains the services which runs in runlevel 5
rc6.d contains the services which runs in runlevel 6

还有一件事,所有服务rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d也都存在于其中,但它只是一个符号链接/etc/init.d

请看这里,这是目录的内容rc1.d

lrwxrwxrwx 1 root root  20 Aug 17 14:54 K15pulseaudio -> ../init.d/pulseaudio
lrwxrwxrwx 1 root root  22 Nov 28 18:47 K20acpi-support -> ../init.d/acpi-support
lrwxrwxrwx 1 root root  20 Aug 17 14:54 K20kerneloops -> ../init.d/kerneloops
lrwxrwxrwx 1 root root  23 Nov  7 15:24 K20openbsd-inetd -> ../init.d/openbsd-inetd
lrwxrwxrwx 1 root root  15 Aug 17 14:54 K20saned -> ../init.d/saned
lrwxrwxrwx 1 root root  27 Aug 17 14:54 K20speech-dispatcher -> ../init.d/speech-dispatcher
-rw-r--r-- 1 root root 369 Apr 14  2012 README
lrwxrwxrwx 1 root root  19 Aug 17 14:54 S30killprocs -> ../init.d/killprocs
lrwxrwxrwx 1 root root  19 Aug 17 14:54 S70dns-clean -> ../init.d/dns-clean

在这里您可以观察到到 init.d 的符号链接 (K15pulseaudio -> ../init.d/pulseaudio)。

但这里每个服务都链接到 init.d,对吗?但不是每个服务都会启动;原因是两个脚本。

第一个是年代脚本(S30killprocs)--->开始

第二个是脚本(K15pulseaudio)---> kill

所有 K 脚本服务都会终止该运行级别的服务,所有 S 脚本服务都会启动该运行级别的服务。

简单来说

S70dns-clean -> ../init.d/dns-clean在运行级别 1启动dns-clean服务。

K15pulseaudio -> ../init.d/pulseaudio终止pulseaudio运行级别 1 中的服务。

答案3

您可以安装 sysv-rc-conf,这是一个 ncurses 程序,用于以图形方式配置/显示 rc 级别。

答案4

是否有命令可以显示所有自动启动服务的列表?

看这里:更新 rc-d-备忘单

是否有命令可以检查服务是否在启动时自动启动?

没有,我知道(这并不意味着什么;),但你可以从这里开始阅读:askubuntu 论坛 - 服务依赖性

相关内容