问题描述
在Ubuntu中,
-
是否有命令显示所有自动启动服务的列表?
-
是否有命令检查服务是否在启动时自动启动?
我做了谷歌和IRC。我找不到答案。也许在Ubuntu中不存在这样的命令。一开始,我以为所有自动启动的服务都在/etc/rc2.d/
下,但是我错了。有些仅在/etc/init/*.conf
下配置。然后,我尝试使用chkconfig
工具(手动安装),但该工具始终无法工作。例如,它给出了从/etc/init/mongodb.conf
自动启动的mongodb
错误的结果。
service --status-all
和initctl list
只能告诉服务当前状态,而不能告诉自动启动状态。 update-rc.d
是用于更改自动启动状态而不显示状态的命令。
如果我的问题没有答案,我只是想知道为什么在Ubuntu中检查自动启动服务如此困难。
最佳办法
Ubuntu使用Upstart
而不是传统的init
系统。新贵比init强大,但比init
复杂一点。
相反,暴发户是基于事件的。 “event”可以类似于”booting” …,也可以更加具体,例如“网络现在可以使用了”。您可以指定哪些脚本取决于哪些事件。只要有可用的CPU,任何不等待事件的东西都可以运行。
这个基于事件的系统还有另一个优点:理论上,即使系统启动并运行,您也可以使用它。最终,暴发户将接管诸如插入或插入外部设备(如拇指驱动器)的任务(当前由udev和hal处理),或在特定时间运行程序(当前由cron处理)。
如您现在所知,一个死的守护程序(在启动时不运行)可能是活动的,并且由于事件而启动。
Ubuntu具有用于Upstart的/etc /init和用于旧SysV文件的/etc/init.d。其中的一些文件是尚未迁移的常规SysV Init脚本。但是,某些已迁移的服务会维护从/etc/init.d到/lib /init /upstart-job的链接。如果您运行其中之一,则可以运行,但是会首先显示警告:
Rather than invoking init scripts through /etc/init.d, use the service(8) utility, e.g.
service mysql restart
Since the script you are attempting to invoke has been converted to an Upstart job, you may also use the restart(8) utility, e.g. restart mysql.
在Upstart机器上,init来自upstart。 Upstart的init无需运行为特定运行级别调用该脚本的主rc脚本,而是从其作业目录中获取作业。
现在我们知道没有简单的方法来列出自动启动守护程序,您应该列出所有守护程序并逐一检查它们。守护程序可以由init
或upstart
甚至是以后的事件启动。获取此列表的最简单方法是在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
在启动时启动。但是其他项目可能看起来更复杂。 (但幸运的是人类可读:-))
次佳办法
实际上,所有服务仅位于/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)杀
所有K脚本服务都会终止该服务,所有S脚本服务都会为该运行级别启动服务。
简单来说
S70dns-clean -> ../init.d/dns-clean
在运行级别1中启动dns-clean
服务。
K15pulseaudio -> ../init.d/pulseaudio
在运行级别1中终止pulseaudio
服务。