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

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

从我的问题来看守护进程的进程 ID 和会话 ID 可以不同吗?,很明显我无法轻易决定守护进程的功能。我在不同的文章和不同的论坛中读到过该service --status-all命令可用于列出我的系统中的所有守护进程。但我不认为该命令列出了所有守护进程,因为该命令未列出NetworkManager当前在我的系统中运行的守护进程。Ubuntu 14.04是否有一些命令可以列出正在运行的守护进程,或者是否有某种方法可以从守护进程filesystem本身找到守护进程?

答案1

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

现在,如果我们使用我提供的信息我的答案,我们可以通过以下方式找到正在运行的守护进程搜索在没有附加控制终端的情况下运行的进程。这可以很容易地通过以下方法完成ps

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

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

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

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

然而,这里出现了两个问题:

  • 如果 root 正在运行图形程序,它们就会显示出来。
  • 没有 root 权限运行的守护进程不会。请注意,在引导时启动的守护进程通常以 root 身份运行。

基本上,我们想显示所有没有控制终端的程序,但不显示 GUI 程序。对我们来说幸运的是,有一个程序可以列出 GUI 进程:xlsclients来自 slm 的回答告诉我们如何使用它来列出所有 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 ^?

答案2

随着现代系统的运行系统(基于 Debian、Fedora、RedHat/CentOs,...),该命令systemctl用于处理 systemd 控制的所有内容。因此,要获取服务列表,您可以执行以下操作:

systemctl | grep daemon

编辑2022/10:说得具体一点,systemd内核里处理的东西很多,你可以运行$ sudo systemctl -t help看看。

要检查服务,请运行$ sudo systemctl --type=service并 grep 查找您想要的服务。

答案3

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

好鬼在/etc/initd里都有写好的启动脚本

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

它在目录中查找他们的名字

/var/lock/子系统

所以你可以

从那里获取名单

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

要扫描所有进程:列出中的每个子目录

/进程

如果名称是数字,则它是正在运行的进程的 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/

(抱歉,格式不太好,我是用手机写的......)

答案4

如果要systemd列出所有当前正在运行的服务(也称为守护进程),请运行以下命令:

sudo systemctl --type=service --state=active

相关内容