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:如何找到守护进程和僵尸进程的列表的主要内容,如果未能解决你的问题,请参考以下文章