在 Ubuntu 中,
- 是否有命令可以显示所有自动启动服务的列表?
- 是否有命令可以检查服务是否在启动时自动启动?
我用 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 脚本,而是从其作业目录中获取作业。
现在我们知道没有简单的方法来列出自动启动守护进程,您应该列出所有守护进程并逐个检查。守护进程可能由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
在启动时启动。但其他项目可能看起来更复杂。(但幸运的是,人类可读 :-) )
答案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 论坛 - 服务依赖性