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