18

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

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

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

4

5 回答 5

17

试试这个。

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

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

守护进程的父进程始终是 Init,因此请检查 ppid 1。守护进程通常不与任何终端关联,因此我们有“?” 在 tty 下。守护进程的进程 ID 和进程组 ID 通常相同 守护进程的会话 ID 与其进程 ID 相同。

于 2014-01-08T21:47:46.367 回答
10

在 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}'

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

于 2013-08-02T03:44:13.683 回答
4

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

所以:

ps -ef | awk '$3 == 1'
于 2013-09-21T01:09:38.483 回答
1

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

于 2013-08-01T18:41:12.253 回答
-1

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

好恶魔在 /etc/initd 中有写得很好的启动脚本

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

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

/var/lock/subsys

这样你就可以

  • 从那里获取名称列表

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

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

/proc

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

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

/proc/1234/status

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

于 2018-08-30T19:35:43.233 回答