如何在Linux系统中查找守护进程和僵尸进程列表


本文将指导您了解僵尸进程和守护进程,并帮助您找到在后台运行的进程。

什么是僵尸进程?

当进程结束执行时,它将向其父进程报告一个退出状态。由于这少量的信息,该进程将作为僵尸进程保留在操作系统进程表中,这表示它不会被安排在未来执行,但该进程无法被完全删除,或者进程ID不会被使用,直到退出状态被确定并且不再需要。

当子进程完成时,父进程将收到一个SIGCHLD信号,表示其一个子进程已完成执行;父进程通常会在此时调用wait()系统调用。该调用将向父进程提供子进程的退出状态,并将导致子进程被回收或从进程表中删除。

守护进程?

Linux是一个多任务操作系统。任何时候运行的每个程序都称为一个进程。每个运行的命令至少启动一个新进程,并且许多系统进程正在运行。

每个进程都由一个称为进程ID (PID) 的数字标识。类似于文件,每个进程都有其所有者和组,并且组和所有者权限有助于识别哪些文件和设备与这些进程相关。大多数进程也有启动它们的父进程。

**示例**: shell是一个进程,在shell中执行的任何命令都是属于shell父进程的进程。例外情况是一个特殊的进程init(8),它是启动时启动的第一个进程,其PID(进程ID)为1。

某些程序需要持续的用户输入并且与终端断开连接才能运行。例如,Web服务器响应Web请求,而不是用户输入。邮件服务器是此类应用程序的另一个示例。这些类型的程序也称为守护进程。

前台进程

每个进程都必须在前台运行。它从键盘获取输入,并在进程之后将输出发送到屏幕。

您可以看到ls命令是如何工作的。如果我想列出我当前目录中的所有文件,可以使用以下命令:

这将显示当前目录中的所有文件。

# ls
lost+found user1 user2

该进程在前台运行,并将输出定向到我的屏幕,如果命令需要任何输入,它将等待输入。

当程序在前台运行并占用大量时间时,我们无法从命令提示符运行任何其他命令,这些命令在程序完成处理之前都是不可用的。

后台进程

后台进程在没有用户交互的情况下运行。如果后台进程需要任何输入,它将等待。

在后台运行进程的优点是您可以运行其他命令,并且不必等到它完成才能启动另一个进程。

启动后台进程最简单的方法是在执行的命令末尾添加一个取值符(&)。

# find . / > files

以上操作会将所有文件和目录的输出写入文件file,这将花费更多时间。例如,行尾的取值符(&) 将在后台作为进程运行,光标将来到提示符处等待另一个命令。

# find ./ > files &
[1] 76742
#

第一行包含有关后台进程的信息,例如正在运行多少个后台进程以及作业编号或进程ID。我们需要知道PID才能在后台和前台之间操作它。

如果您现在按Enter键,我们将看到以下输出

[1]+ Done find . / > files

第一行告诉您find命令后台进程已成功完成并等待其他命令。

列出正在运行的进程

此命令将通过运行ps(进程状态)命令来列出自己的进程。

# ps
PID    TTY       TIME CMD
69301  pts/0    00:00:00 bash
78926  pts/0    00:00:00 ps

ps常用的标志是-f,-f将显示完整信息,如下所示提供更多信息。

# ps -f
UID    PID    PPID    C    STIME    TTY    TIME CMD
root   69301 69261    0    13:34    pts/0  00:00:00 -bash
root   79099 69301    0    13:51    pts/0  00:00:00 ps -f

PS命令的完整用法

# ps --help
********* simple selection ********* ********* selection by list *********
-A all processes                          -C by command name
-N negate selection                       -G by real group ID (supports names)
-a all w/ tty except session leaders      -U by real user ID (supports names)
-d all except session leaders             -g by session OR by effective group name
-e all processes                          -p by process ID
                                          -q by process ID (unsorted & quick)
T all processes on this terminal          -s processes in the sessions given
a all w/ tty, including other users       -t by tty
g OBSOLETE -- DO NOT USE                  -u by effective user ID (supports names)
r only running processes                   U processes for specified users
x processes w/o controlling ttys           t by tty
*********** output format ********** *********** long options ***********
-o,o user-defined    -f full              --Group --User --pid --cols --ppid
-j,j job control     s signal             --group --user --sid --rows --info
-O,O preloaded -o    v virtual memory     --cumulative --format --deselect
-l,l long             u user-oriented    --sort --tty --forest --version
-F extra full        X registers         --heading --no-heading --context
                                         --quick-pid
********* misc options *********
-V,V show version       L list format codes        f ASCII art forest
-m,m,-L,-T,H threads    S children in sum          -y change -l format
-M,Z security data      c true command name       -c scheduling class
-w,w wide output        n numeric WCHAN,UID          -H process hierarchy

停止进程

可以通过多种方式停止进程。通常,从命令行发送CTRL + C按键 – 将退出命令。当进程在前台运行时,这将起作用。

如果进程在后台模式下运行,则首先需要使用**ps**命令获取其作业ID,然后可以使用**kill**命令杀死该进程,如下所示:

# ps -f
UID    PID    PPID    C    STIME TTY       TIME CMD
root  69301   69261   0    13:34 pts/0    00:00:00 -bash
root  82913   69301   0    13:58 pts/0    00:00:00 ssh [email protected]
root  82952   69301   0    13:58 pts/0    00:00:00 ps -f

# kill 82913
Terminated

此处kill命令将终止ssh [email protected]。如果进程忽略常规kill,我们可以使用kill -9后跟进程ID,如下所示。

# ps -f
UID    PID    PPID     C    STIME TTY    TIME CMD
root    69301 69261    0 13:34 pts/0    00:00:00 -bash
root    83964 69301    0 14:00 pts/0    00:00:00 ps -f
[1]+    Killed                ssh [email protected]

我们如何查看系统上是否正在运行僵尸进程?

运行“ps aux”并查找STAT列中的Z。

# ps -aux
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
USER    PID    %CPU    %MEM    VSZ    RSS    TTY    STAT    START    TIME    COMMAND
root    11647 0.0 0.1 549100 7348 ? S Mar18 0:13 /usr/libexec/clock-applet --oaf-activate-iid=OAFIID:GNOME_ClockApplet_Factory --oaf-ior-fd=28
root 11648 0.0 0.1 400744 5552 ? S Mar18 0:00 /usr/libexec/gdm-user-switch-applet --oaf-activate-iid=OAFIID:GNOME_FastUserSwitchApplet_Factry --oaf-ior-fd=34
root 11649 0.0 0.1 290996 4072 ? S Mar18 0:00 /usr/libexec/notification-area-applet --oaf-activate-iid=OAFIID:GNOME_NotificationAreaApplet_Factory --oaf-ior-fd=40
root 11681 0.0 0.0 137416 1524 ? S Mar18 0:00 /usr/libexec/gvfsd-burn --spawner :1.9 /org/gtk/gvfs/exec_spaw/
root 11696 0.0 0.0 135276 1320 ? S Mar18 0:00 /usr/libexec/gvfsd-metadata
root 12196 0.0 0.0 0 0 ? Z Mar18 0:20 [yumBackend.py] <defunct
root 13284 0.0 0.1 303428 6212 ? Sl Mar18 0:00 gnome-terminal
root 13286 0.0 0.0 8228 620 ? S Mar18 0:00 gnome-pty-helpe
root 13287 0.0 0.0 108340 1340 pts/0 Ss+ Mar18 0:00 bas
root 14347 0.0 0.0 223336 3408 ? S 10:50 0:00 smbd -D
root 14578 0.0 0.4 425524 18172 ? Ss Mar25 0:21 /usr/sbin/http
apache 15091 0.0 1.5 414648 61904 ? S Apr05 0:44 php-fpm: pool ww
postfix 18359 0.0 0.0 80948 3384 ? S 12:24 0:00 pickup -l -t fifo -u

在上面的示例中,进程ID为12196的进程的状态为z,使用kill命令杀死该进程

#kill -9 12196

阅读本文后,您将能够理解什么是僵尸进程和守护进程,以及如何找到它们和如何停止它们,以及如何使进程在后台运行。

更新于:2020年1月21日

5000+ 浏览量

启动您的职业生涯

完成课程后获得认证

开始学习
广告