我尝试检查Google,但我找不到与实际问题相关的太多信息。
如何获得僵尸进程和守护程序进程的整合列表? 我如何在不同的操作系统上执行此操作。 Linux呢? AIX?视窗?
我确信,基于PID,我们无法识别过程的类型。通过终端运行可能也无济于事。
答案 0 :(得分:16)
试试这个。
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相同。
答案 1 :(得分:10)
在Linux上使用GNU ps:
[
$ ps --version
procps-ng version 3.3.3
僵尸:
ps -lA | grep '^. Z'
会给你所有的僵尸(请注意,param是小写的'L',即'l'后跟'A')。
守护程序:
正如@Barmar所说,没有办法确定守护进程,但是一个进程是守护进程的线索是它与任何TTY设备无关。 'ps -Al'输出的第12列是TTY;第四个是PID,第四个是进程名称。因此:
ps -lA | awk '$12 == "?" {print $4, $14}'
将为您提供可能守护进程的进程;不保证! :)
答案 2 :(得分:2)
守护进程由init进程启动,这意味着它们的PPID为1。
因此:
ps -ef | awk '$3 == 1'
答案 3 :(得分:1)
要获取Zombie和守护进程列表,只需编写一个伪字符开发驱动程序,您应在其中浏览task_struct并查找状态
答案 4 :(得分:0)
我是为守护程序和“旧的” sysv initd编写的,您必须检查它是否可以在您的发行版上正常工作。
好的恶魔在/ etc / initd中有写好的启动脚本
更改运行级别时,init如何知道正在运行的守护程序?
它将在目录中查找其名称
/ var / lock / subsys
所以你可以
从那里获取名称列表
扫描所有正在运行的进程,并检查名称是否在列表中:bingo!
要扫描所有进程,请列出以下所有子目录:
/ proc
如果它的名字是数字,则它是正在运行的进程的pid。
例如,pid为1234的进程的状态是此文件
/ proc / 1234 /状态
打开它并获得第一行,以“名称:”开头
请参见
http://man7.org/linux/man-pages/man5/proc.5.html
https://linuxexplore.com/2014/03/19/use-of-subsystem-lock-files-in-init-script/
(抱歉,格式令人讨厌,我正在用手机写信...)