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


22

在Ubuntu中,

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

我做了谷歌和IRC。我找不到答案。也许在Ubuntu中不存在这样的命令。一开始,我以为所有自动启动的服务都在之下/etc/rc2.d/,但是我对此表示错误。有些仅在下进行配置/etc/init/*.conf。然后,我尝试使用该chkconfig工具(手动安装),但该工具始终无法正常工作。例如,它给出了错误的结果,mongodb该结果从自动启动/etc/init/mongodb.conf

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

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


我认为chkconfig --list会正常吗?on表示该服务正在该运行级别上运行,并且该服务将在系统启动时自动启动。
最大

1
正如我在问题中发布的那样,chkconfig并不总是有效。例如,它将给mongodb错误的结果。我认为可能是因为mongodb使用/etc/init/mongodb.conf来执行自动启动。
SSS 2012年

怎么ls /etc/rc?.d
toxaq

Answers:


11

Ubuntu使用Upstart而不是传统init系统。新贵胜于init,但比复杂init

相反,新贵是基于事件的。“事件”可以是诸如“正在启动”之类的东西,也可以是更具体的事物,如“网络现在可以使用了”。您可以指定哪些脚本取决于哪些事件。只要有可用的CPU,任何不等待事件的东西都可以运行。

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

如您现在所知,一个死的守护程序(在启动时不运行)可能是活动的,并且由于事件而启动。

Ubuntu具有用于Upstart的/ etc / init和用于旧SysV文件的/etc/init.d。其中的一些文件是尚未迁移的常规SysV Init脚本。但是,某些已迁移的服务会维护从/etc/init.d到/ lib / init / upstart-job的链接。如果您运行其中之一,则可以运行,但是会首先显示警告:

与其通过/etc/init.d调用初始化脚本,不如使用service(8)实用程序,例如 service mysql restart

由于您尝试调用的脚本已转换为Upstart作业,因此您也可以使用restart(8)实用程序,例如,重新启动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从启动就开始。但是其他项目可能看起来更复杂。(但幸运的是人类可读:-))


我知道您发布的大部分内容。即使有些我不知道的新东西,它们仍然无法解决我的问题。我只是想知道是否有一个命令可以轻松完成这项工作(针对新贵服务和init服务)。看来ubuntu没有一个。太遗憾了!顺便说一句,“ initctl”只能处理新贵服务,而不能处理传统的init系统。如果没有简单的方法,那么我必须使用困难的方法...谢谢。
SSS 2012年

我会指出,虽然不是不正确的现代版本的ubuntu已移至systemd。可笑的是,这个答案的很大一部分仍然有效
Journeyman Geek

Ubuntu的新版本不使用暴发户,但systemd unix.stackexchange.com/a/287282/147671
若昂·皮门特尔·费雷拉

5

实际上,所有服务仅位于/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,对吗?但是,每项服务都不会启动;原因是两个脚本。

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

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

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

简单来说

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

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


对于新贵服务而言并非如此,在这里可能根本不会出现。
通配

2

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.