列出启动时启动的所有服务


15

我正在寻找一种获取所有服务(/etc/init.d或upstart或systemd)的列表的方法,这些服务应该已启动(或已在启动时启动)。

您如何获得所有启动服务的列表?—我知道这个问题,建议使用service --status-all

但这并没有告诉我,哪些服务应该处于运行状态。它使用“ status”参数调用所有初始化脚本。这是所有可能正在运行的服务的列表。

但是我想知道,在引导时启动的服务是否仍在运行。

例…

我已经安装了webfs。但是我不希望它在启动时运行。因此,我禁用了它:sudo update-rc.d webfs disable。而且我还安装了samba,它应该在启动时运行。但是它已停止(无论出于何种原因)。sudo service --status-all在这里没有帮助我:

$ sudo service --status-all 2>/dev/null | grep -E 'samba$|webfs'
 [ - ]  samba
 [ - ]  webfs

两者都关闭了,但是我不知道,应该打开一个(桑巴舞)。

所以…

如何获得启动时启动的所有服务的列表?并且,作为扩展,是否有一种简单的方法来获取这些服务的“状态”(如果没有,我将简单地遍历此列表并运行“ service $ service status”,或类似的东西)。

谢谢,亚历山大

编辑2015-05-04: 我在Ubuntu 14.04上。

这个问题的主要重点如下:

但是我想知道,在引导时启动的服务是否仍在运行。

因此,initctl list没有太大帮助。它实际上并没有考虑/etc/init.d脚本启动的服务(与中的新贵脚本相比/etc/init)。

另外列出/etc/rc?.d/S*并没有帮助。它将生成服务列表,这些服务可能已在给定的运行级别中启动。它没有显示我是否应该启动的服务仍在运行。

基本上,我正在svcs -x从Solaris for Ubuntu 寻找类似的东西。使用svcs -x,如果已启动的服务不再运行,我将获得输出。这,我也需要Ubuntu。

原因:我想对我们的Icinga / Nagios监视系统进行(或多或少...)常规检查,如果某项服务不再运行,应该会提醒我。由于我们为许多不同的客户提供了许多不同的服务器,因此定义“重要”服务的列表并不能真正扩展。


哪个Ubuntu版本?
AB


@Parto该问题的公认答案是initctl list,哪个列出了已启动/正在运行的进程,但该列表还将包括手动启动的进程
Sergiy Kolodyazhnyy 2015年

@AB我在Ubuntu 14.04上。
亚历山大·斯瓦尔

@ Partoaskubuntu.com/ questions/ 218/…并没有提供答案。正如@Serg所写,答案是使用initctl list。但这并不能真正解决问题,因为它还会显示手动启动的服务。而且它不显示未运行的服务。
亚历山大·斯瓦尔

Answers:


19

所有服务均在启动时启动:

initctl list

系统中存在的所有服务的列表:

service --status-all

错误。都不提供已启用服务的列表(在启动时启动)。它们显示所有已知服务(其中一些可能已禁用)以及它们当前是否正在运行(这不一定意味着它们会自动启动)。
Reinier Post

2

这是我的班轮 grep -i 'runlevel' /etc/init/* | awk '!/#/ && /start on/ && /2/ {gsub("/"," "); print $0 }' | cut -d ' ' -f4-

可以通过以下方式获得更清晰的输出 grep -i 'runlevel' /etc/init/* | awk '/start on/ && /2/ {gsub("/"," "); gsub(":", " ");gsub(".conf"," "); print $3 }'

现在让我们进入细节。新贵的工作都存储在里面了/etc/init/吧?那里的作业都有一行,说明它们从哪个运行级别开始。运行级别2是正常引导,默认运行级别。因此,如果我们对所有说的行runlevel进行grep并使用awk清除grep的输出以仅匹配start on运行级别为#2的行,我们将获得新贵作业的列表。其余的仅用于格式化需求,将文件名中的/替换为空格,并切断这些文件的路径,而保留文件名本身。

!/#/部分是为了解决可能被注释掉的启动指令,这是我亲自手动添加的。

除其他事项外,还有/etc/rc2.d(如果我理解正确的话)您的优先级较低的脚本。

粗糙的单线是: ls /etc/rc2.d/* | grep S | awk '{sub("S"," "); print $2}

该文件夹中实际在运行级别2上运行的脚本的名称以S开头,后跟优先级编号。现在,基本上,我们得到所有以S开头的文件,并仅使用优先级名称列出它们(仍然需要弄清楚如何清除它们)。

正如muru在评论中正确指出的那样,还有一些/etc/init/*.override文件,它们可能“……修改作业的运行方式,而不必直接修改其配置文件”(init联机帮助页

目前,由于我对这些文件没有太多经验,所以我只能建议通过使用'grep'manual'/etc/init/*.override'列出要启动的服务来浏览这些.override文件。使用initctlservices命令手动进行。


请注意,由于事件相关性,无法轻松确定给定服务是否会导致其他服务启动。还有.override文件的小问题。
muru

@Serg谢谢。但这只涉及新贵的东西。同样,“ ls /etc/rc2.d/* ...”也无济于事。它会显示哪些服务可能已启动。但是它没有显示哪些服务仍在运行。我想,我的帖子的重点尚不清楚。我正在寻找:但是我想知道,如果在启动时启动的服务仍在运行。 不知道您是否了解Solaris。在这里,我只需要执行“ svcs -x”,如果返回了某些内容,则表明某些内容没有运行。对于Ubuntu,我需要这样的东西。
亚历山大·斯瓦尔

可以编写一个脚本或bashrc函数来比较我那里的一个内衬和initctl列表的输出。要我发布吗?
Sergiy Kolodyazhnyy,2015年

@Serg好-如果您愿意的话;)
Alexander Skwar 2015年

2

列出所有服务和各自的运行级别状态-chkconfig样式:

# sysv-rc-conf --list

acpid        2:on       3:on    4:on    5:on
apache-htcac 0:off      1:off   2:off   3:off   4:off   5:off   6:off
apache2      0:off      1:off   2:on    3:on    4:on    5:on    6:off

所有列出的基于交互式文本的编辑:

# sysv-rc-conf

l SysV Runlevel Config   -: stop service  =/+: start service  h: help  q: quit qk
x 
x service      1       2       3       4       5       0       6       S 
x ----------------------------------------------------------------------------
x acpid       [ ]     [X]     [X]     [X]     [X]     [ ]     [ ]     [ ]
x apache-ht$  [ ]     [ ]     [ ]     [ ]     [ ]     [ ]     [ ]     [ ]
x apache2     [ ]     [X]     [X]     [X]     [X]     [ ]     [ ]     [ ]
x
x Use the arrow keys or mouse to move around.      ^n: next pg     ^p: prev pg
x                        space: toggle service on / off

如果不存在,可能必须安装它:

apt install sysv-rc-conf
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.