我正在寻找一种方法来获取所有服务(/etc/init.d 或 upstart 或 systemd)的列表,这些服务应该在启动时启动(或已经启动)。
如何获取所有启动服务的列表?— 我知道这个问题,并且它建议使用service --status-all
。
但这并没有告诉我,哪些服务是应该运行。它使用“ ”参数调用所有 init 脚本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
脚本启动的服务(与 中的 upstart 脚本相比/etc/init
)。
列表也/etc/rc?.d/S*
无济于事。它会生成可能在给定运行级别启动的服务列表。它不会向我显示应该启动的服务是否仍在运行。
基本上,我正在寻找类似svcs -x
Solaris 的 Ubuntu 版本。有了svcs -x
,如果已启动的服务不再运行,我就会得到输出。对于 Ubuntu,我也需要这个。
原因:我想对我们的 Icinga/Nagios 监控系统进行(或多或少...)通用检查,如果某个服务不再运行(该服务应该运行),它会提醒我。由于我们为许多不同的客户提供许多不同的服务器,因此定义“重要”服务列表实际上并不方便。
答案1
所有服务在启动时启动:
initctl list
系统中存在的所有服务的列表:
service --status-all
答案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
答案3
以下是我的一句话
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 }'
现在让我们详细了解一下。Upstart 作业都存储在 中/etc/init/
,对吧?那里的作业都有一行说明它们在哪个运行级别启动。运行级别 2 是正常启动的默认运行级别。因此,如果我们 grep 所有显示 的行,runlevel
并使用 awk 清理 grep 的输出以仅匹配带有start on
和运行级别 #2 的行,我们将获得 upstart 作业的列表。其余的只是为了满足格式需要,将文件名中的 / 替换为空格,并删除这些文件的路径,保留文件名本身。
这!/#/
部分是为了解决可能被注释掉的启动指令,这些指令是我个人手动添加的。
除其他事项外,/etc/rc2.d
(如果我理解正确的话)还有一些优先级较低的脚本。
粗略的一句话是:
ls /etc/rc2.d/* | grep S | awk '{sub("S"," "); print $2}
该文件夹中实际在运行级别 2 上运行的脚本以 S 开头,后跟优先级数字。现在,基本上,我们获取所有以 S 开头的文件,并仅列出优先级名称(仍然需要弄清楚如何清理它)。
正如 muru 在评论中正确指出的那样,还有/etc/init/*.override
一些文件可能“...修改作业的运行方式,而无需直接修改其配置文件”(初始化手册页)
目前,由于我对这些文件没有太多经验,我只能建议使用“grep 'manual' /etc/init/*.override”查看那些 .override 文件,以列出需要使用initctl
或services
命令手动启动的服务。