如何列出所有正在运行的守护程序?


32

从我的问题来看,很明显我无法轻松确定service --status-all守护程序的功能。我在不同的文章中以及在不同的论坛中都读到了可以使用command列出系统中所有守护程序的内容。但是我不认为该命令列出了所有守护程序,因为该命令未列出NetworkManager当前正在Ubuntu 14.04系统中运行的守护程序。是否有一些命令列出正在运行的守护程序,或者是否有某种方法可以从filesystem自身中查找守护程序?


您确定未列出吗?你怎么检查?我可以在Debian上看到它。请注意,名称network-manager不是NetworkManager
terdon

是。我确定。没有列出与术语网络相关的任何内容。它还列出anacron了在其init脚本中提到不是守护程序的对象。
Jackzz 2014年

Anacron不是守护程序,更多的是语义问题,因为它不会持续运行。它仍然作为服务运行,通常称为守护程序。请编辑您的问题,然后i)告诉我们您正在运行哪个Ubuntu,以及ii)“守护程序”的确切含义。您的最终目标是什么?
terdon

我想在后台运行的任何服务都是守护程序。我anacron之所以提到它,是因为它/etc/init.d/anacron不是守护程序。我的目标是编写一个C++程序来列出系统中运行的所有守护程序。为此,我需要知道要解析的文件以获取详细信息。
Jackzz 2014年

1
好吧,如果您将守护程序定义为服务,service --status-all那么您就需要。Ubuntu似乎对NetworkManager的对待有所不同。我同时获得networkingnetwork-manager在输出services --status-allDebian的,但只有networking在Ubuntu。我认为您需要定义“守护程序”的确切含义。
terdon

Answers:


52

守护程序的概念附加到进程,而不是文件。因此,“在文件系统上查找守护程序”毫无意义。只是为了使这个概念更加清楚:程序是一个可执行文件(在的输出中可见ls); 进程是该程序的实例(在的输出中可见ps)。

现在,如果使用我在回答中提供的信息,则可以通过搜索未连接控制终端的进程来找到正在运行的守护程序。可以很容易地做到这一点ps

$ ps -eo 'tty,pid,comm' | grep ^?

tty输出字段包含“?” 当进程没有控制终端时。

当您的系统运行图形环境时,就会出现一个大问题。由于GUI程序(即Chromium)未附加到终端,因此它们也会出现在输出中。在root不运行图形程序的标准系统上,您可以简单地将前一个列表限制为root的进程。这可以通过使用ps' -U开关来实现。

$ ps -U0 -o 'tty,pid,comm' | grep ^?

但是,这里出现两个问题:

  • 如果root正在运行图形程序,则将显示它们。
  • 没有root特权的守护程序将不会运行。请注意,启动时启动的守护程序通常以root身份运行。

基本上,我们想显示所有没有控制终端的程序,而不是GUI程序。幸运的是,有一个程序列表界面流程:xlsclientsslm的答案告诉我们如何使用它列出所有GUI程序,但是由于我们要排除它们,因此我们必须将其反转。可以使用--deselect开关来完成。

首先,我们将建立一个我们正在运行其进程的所有GUI程序的列表。从我刚刚链接的答案,这是使用...完成的

$ xlsclients | cut -d' ' -f3 | paste - -s -d ','

现在,ps有了一个-C允许我们通过命令名称进行选择的开关。我们刚刚得到了命令列表,因此让我们将其注入ps命令行。请注意,我--deselect随后使用的是撤消选择。

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect

现在,我们有了所有非GUI进程的列表。让我们不要忘记我们的“不附加TTY”规则。为此,我将添加-o tty,args到上一行,以便输出tty每个进程(及其完整的命令行):

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --deselect -o tty,args | grep ^?

最终grep捕获所有以“?”开头的行,即没有控制tty的所有进程。然后你走了!最后一行使您可以在没有控制终端的情况下运行所有​​非GUI进程。请注意,您仍然可以改善它,例如,通过排除内核线程(不是进程)...

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,args | grep ^?

...或添加几栏信息供您阅读:

$ ps -C "$(xlsclients | cut -d' ' -f3 | paste - -s -d ',')" --ppid 2 --pid 2 --deselect -o tty,uid,pid,ppid,args | grep ^?

linux在虚拟文件系统procfs上保留许多信息。因此“在文件系统上查找守护程序”是可行的!
马西莫'18

0

我是为“旧的” sysv initd编写的,您必须检查它是否在发行版上正常工作。

优秀的恶魔在/ etc / initd中具有编写良好的启动脚本

在更改运行级别时,init如何知道正在运行的守护程序?

它在目录中查找其名称

/ var / lock / subsys

这样你就可以

从那里获取名单

扫描所有正在运行的进程,并检查名称是否在列表中:bingo!

要扫描所有进程,请执行以下操作:列出其中的每个子目录

/ proc

如果名称是数字,则它是正在运行的进程的pid。

例如,pid为1234的进程的状态是此文件

/ proc / 1234 /状态

打开它并获得第一行,以“ Name:”开头

看到

http://man7.org/linux/man-pages/man5/proc.5.html

https://linuxexplore.com/2014/03/19/use-of-subsystem-lock-files-in-init-script/

(抱歉,格式令人讨厌,我正在用手机写信...)

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.