Linux:如何找到守护进程和僵尸进程的列表

Posted

技术标签:

【中文标题】Linux:如何找到守护进程和僵尸进程的列表【英文标题】:Linux: How to find the list of daemon processes and zombie processes 【发布时间】:2013-08-02 04:49:52 【问题描述】:

我尝试在 Google 上查看,但找不到与实际问题相关的太多信息。

如何获得僵尸进程和守护进程的综合列表? 我如何在不同的操作系统上做到这一点。 Linux?艾克斯?窗户?

我确信,基于 PID,我们无法识别进程的类型。通过终端运行也可能无济于事。

【问题讨论】:

没有办法识别守护进程,但是僵尸在ps的状态栏中有Z 作为约定,守护进程在其名称的末尾有 d,即 systemd、httpd 等。 【参考方案1】:

试试这个。

ps axo pid,ppid,pgrp,tty,tpgid,sess,comm |awk '$2==1' |awk '$1==$3'

在上面的命令中,我使用守护进程的特性从 Linux 中的所有现有进程中过滤掉它们。

守护进程的父进程始终是 Init,因此请检查 ppid 1。 守护进程通常不与任何终端关联,因此我们在 tty 下有“?”。 守护进程的 process-id 和 process-group-id 通常是相同的 守护进程的 session-id 与它的进程 id 相同。

【讨论】:

【参考方案2】:

在 Linux 上使用 GNU ps:

[

$ ps --version

procps-ng version 3.3.3

]

僵尸:

ps -lA | grep '^. Z'

会让你变成僵尸(注意参数是小写的“L”,即“l”后跟“A”)。

守护进程:

正如@Barmar 所说,没有办法确定守护进程,但进程是守护进程的线索是它与任何 TTY 设备无关。 'ps -Al' 输出的第 12 列是 TTY;第 4 位是 PID,第 14 位是进程名称。因此:

ps -lA | awk '$12 == "?" print $4, $14'

将为您提供可能守护进程的进程;不保证! :)

【讨论】:

【参考方案3】:

守护进程由 init 进程启动,这意味着它们的 PPID 为 1。

因此:

ps -ef | awk '$3 == 1'

【讨论】:

但这也会输出那些不是守护进程的进程。因为,如果一个进程的父进程在一个子进程之前死亡,那么该子进程将由 init() 作为父进程。【参考方案4】:

要获取 Zombie 和守护进程的列表,只需编写一个伪字符开发驱动程序,您应该在其中浏览 task_struct 并查找状态

【讨论】:

没错,但是:(a) 更多的努力 (b) 你仍然无法确定哪个是守护进程 请您详细介绍一下“编写伪字符开发驱动程序”吗?此外,通过 task_struct 导航,是否可以精确识别守护进程。意思是,肯定的。没有不匹配。【参考方案5】:

我为守护进程和“旧”sysv initd 编写了代码,您必须检查它是否在您的发行版上运行。

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

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

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

/var/lock/subsys

所以你可以

从那里获取名称列表

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

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

/proc

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

比如pid为1234的进程的状态就是这个文件

/proc/1234/status

打开它并得到第一行,以“名称:”开头

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

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

【讨论】:

以上是关于Linux:如何找到守护进程和僵尸进程的列表的主要内容,如果未能解决你的问题,请参考以下文章

浅析三种特殊进程:孤儿进程,僵尸进程和守护进程.

第7章 进程关系_守护孤儿和僵尸进程

孤儿进程僵尸进程和守护进程

守护进程, 协同进程, 僵尸进程, 孤儿进程概念理解

戏说守护僵尸孤儿进程

菜鸟随笔---三种进程学习.孤儿进程.僵尸进程.守护进程