在 Linux 系统中,除 PID 为 0 的第一个 init 进程(或 systemd )外,其余进程都有父进程。进程也可以拥有自己的子进程。
你可以通过使用 pstree 命令 来查看进程的树型结构,你可以清晰的看到各个进程的“家族树”。
在 Linux 系统中,正常情况下,子进程死亡后其父进程会接收到通知进行一些例如释放内存之类的清理 *** 作。但是,如果父进程未收到通知察觉子进程死亡,那么子进程就进入了“僵死”状态。
这就是僵死进程产生的原因。
僵尸进程并不可怕,少量的僵尸进程对系统影响并不大。但如果系统的内存已经所剩不多或者有太多的僵尸进程在耗掉内存,问题会变得糟糕。
同样,大部分 Linux 系统进程最大 PID 设置为 32768,如果过多僵尸进程导致其他重要任务没有 PID 可用,那么你的系统会发生崩溃。
特别当存在一个编码糟糕的程序开始大量产生僵尸进程的时候,这种情况经常发生。在这种情况下,我们就需要找到并杀死僵尸进程。
在linux系统中,进程有如下几种状态,它们随时可能处于以上状态中的一种:
我们可以在命令终端中通过 top命令 来查看系统进程和它的当前状态。
命令如下:
如上面截图中看到的,其中共有 250 个任务(进程),其中 1 个处在 “运行中running” 状态,248 个进程处于 “休眠sleep” 状态,还有一个处于 “僵尸zombie” 状态。
现在问题进入下一步,如何杀死 “僵尸” 进程?
僵尸进程对系统来说就是已经死亡的进程,那么如何杀掉一个已经死亡的进程呢?
方法很简单,我们只需要通过如下ps命令就可以列举僵尸进程,得到它们的进程 ID。
ps ux 命令输出的第 8 列显示了进程状态。上述命令将会打印所有处在 Z+ 状态(表示僵尸状态)的进程。
确认了进程 ID 后,我们可以得到它的父进程 ID:
你也可以将上述两个命令结合在一起,直接得到僵尸进程的 PID 及其父进程的 PID:
通过以上命令都可以找到僵尸进程,然后你就可以通过 kill命 令杀掉了。
或者通过如下命令查看僵尸进程:
该命令输出结果上你可以直接看出其父进程ID,这时候你直接使用kill命令杀掉即可。
再次运行 ps 命令或 top 命令,你可以验证僵尸进程是否已经被杀死。
通过本文你将认识 Linux 系统中的僵尸进程以及明白了其产生的主要原因。同时,你也能学会如何查找僵尸僵尸进程并杀掉僵尸进程。
当然你也可以自己别写脚本设置成定时运行任务自动来替你做这些工作。
Linux中杀掉一个进程可以用kill和killall命令,killall命令用命令名字来杀死指定进程,而kill命令则是用进程PID来杀死进程。killall命令,顾名思义就是杀死所有以某个命令启动的所有进程,用killall命令杀死进程的命令是这样的(这里是杀死以httpd命令启动的所有进程):
killall -9 httpd
-9参数表示强制终止进程。
最常用的是用kill命令结束进程,但是kill命令需要用进程的PID作为参数。如何知道指定进程的PID呢?如果是通过进程命令名字查看对应PID,可以通过ps或pstree命令看到它的PID;如果是通过网络监听端口号查看进程,需要用netstat命令看看端口号对应的进程的PID。
ps命令用于查看系统所有进程,而pstree命令以树状显示进程之间的关系,有助于判断要杀死哪个进程。记住在它们显示的结果中记下需要结束的进程PID。ps命令的常用用法是:
ps aux
-a参数表示不与终端有关的进程也显示出来。
pstree命令的常见用法是:
pstree -Aup
-p参数表示列出进程PID。
netstat命令可以查看监听端口的进程是哪个,常用的方式是:netstat -tlnp
这条命令的意思是列出系统里面监听网络连接的端口号和相应的进程PID。
参数说明:
-t:表示列出TCP连接(也可以加上-u参数表示同时列出UDP网络连接)
-l:表示列出正在网络监听的服务
关键是下面两个参数:
-n:表示以端口号来显示
-p:表示列出进程PID
Local Address这一列下面就有端口号,可以看到它对应的PID是多少,还有Program name那一列是进程名字。同样是要记下需要结束的进程的PID。
知道了指定进程的PID后,就可以用kill命令结束进程了:
kill -9 PID号码
或者kill -2 PID号码
-9参数是强制结束进程,而-2参数是相当于用键盘组合键Ctrl+C的方式正常结束进程。
方法一: Terminal终端输入: gnome-system-monitor,就可以打开system monitor如图:然后找到相应进程,右击选择kill process就可以了方法二: 通过kill 进程id的方式可以实现,首先需要知道进程id, 例如,想要杀死firefox的进程,通过 ps -ef|grep firefox,可以查到firefox的进程id:然后通过 kill 3781 就可以关闭进程了.补充: 1. kill -9 来强制终止退出, 例如: kill -9 37812.特殊用法:kill -STOP [pid]发送SIGSTOP (17,19,23)停止一个进程,而并不消灭这个进程。kill -CONT [pid]发送SIGCONT (19,18,25)重新开始一个停止的进程。kill -KILL [pid]发送SIGKILL (9)强迫进程立即停止,并且不实施清理 *** 作。kill -9 -1终止你拥有的全部进程。方法三: killall 通过程序的名字,来杀死进程例如: killall firefox注意: 该命令可以使用 -9 参数来强制杀死进程, killall -9 firefox方法四: pkill 通过程序的名字, 直接杀死所有进程例如: pkill firefox方法五: 通过xkill 可以杀死图形程序应用, 例如firefox崩溃无响应,可以使用该命令.例如: 用法xkill , 会出现一个白色的x, 然后用鼠标单击想要杀死的应用,如图以下内容引用自: http://justcoding.iteye.com/blog/1931347◆编者注:KILLALL(Section: User (1)/Updated: 1999年9月7日)———————————————– NAME (名称)killall – 以名字方式来杀死进程 SYNOPSIS (总览)killall [-egiqvw] [-signal] name …killall -lkillall -V DESCRIPTION (描述)killall 发送一条信号给所有运行任意指定命令的进程. 如果没有指定信号名, 则发送SIGTERM.。信号可以以名字 (如 -HUP ) 或者数字 (如 -1 ) 的方式指定. 信号 0 (检查进程是否存在)只能以数字方式指定。如果命令名包括斜杠 (/), 那么执行该特定文件的进程将被杀掉, 这与进程名无关。如果对于所列命令无进程可杀, 那么 killall 会返回非零值. 如果对于每条命令至少杀死了一个进程, killall 返回 0。Killall 进程决不会杀死自己 (但是可以杀死其它 killall 进程)。 OPTIONS (选项)-e对 于很长的名字, 要求准确匹配. 如果一个命令名长于 15 个字符, 则可能不能用整个名字 (溢出了). 在这种情况下, killall 会杀死所有匹配名字前 15 个字符的所有进程. 有了 -e 选项,这样的记录将忽略. 如果同时指定了 -v 选项, killall 会针对每个忽略的记录打印一条消息。-g杀死属于该进程组的进程. kill 信号给每个组只发送一次, 即使同一进程组中包含多个进程。-i交互方式,在杀死进程之前征求确认信息。-l列出所有已知的信号名。-q如果没有进程杀死, 不会提出抱怨。-v报告信号是否成功发送。-V显示版本信息。-w等待所有杀的进程死去. killall 会每秒检查一次是否任何被杀的进程仍然存在, 仅当都死光后才返回. 注意: 如果信号被忽略或没有起作用, 或者进程停留在僵尸状态, killall 可能会永久等待。FILES(相关文件)/proc proc文件系统的存在位置。KNOWN bugS (已知 BUGS)以文件方式杀死只对那些在执行时一直打开的可执行文件起作用, 也即, 混杂的可执行文件不能够通过这种方式杀死。要警告的是输入 killall name 可能不会在非 Linux 系统上产生预期的效果, 特别是特权用户执行时要小心。在两次扫描的间隙, 如果进程消失了而被代之以一个有同样 PID 的新进程, killall -w 侦测不到。来源:http://www.ubuntuhome.com/ubuntu-kill-command.html下面来了解相关命令:一、查看进程的命令 有ps、pstree、pgrep等: 1、ps 显示进程信息,参数可省略 -aux 以BSD风格显示进程 常用-efH 以System V风格显示进程-e , -A 显示所有进程a显示终端上所有用户的进程x显示无终端进程u 显示详细信息f树状显示w 完整显示信息l 显示长列表在终端中执行ps aux,各列输出字段的含义:USER进程所有者PID 进程IDPPID 父进程%CPU CPU占用率%MEM 内存占用率NI 进程优先级。数值越大,占用CPU时间越少VSZ 进程虚拟大小RSS 页面文件占用TTY 终端IDSTAT 进程状态+---D 不可中断Uninterruptible sleep (usually IO)+---R 正在运行,或在队列中的进程+---S 处于休眠状态+---T 停止或被追踪+---Z 僵尸进程+---W 进入内存交换(从内核2.6开始无效)+---X 死掉的进程+---< 高优先级+---N 低优先级+---L 有些页被锁进内存+---s 包含子进程+---+ 位于后台的进程组;+---l 多线程,克隆线程 multi-threaded (using CLONE_THREAD, like NPTL pthreads do)PID:进程标识符,系统为每一个进程分配一个识别码,称为PID。ps命令极为常用,其他命令还有:2.pstree树状显示进程信息-a 显示完整命令及参数-c 重复进程分别显示-c 显示进程ID PID-n 按 PID 排列进程3.pgrep <进程名> 显示进程的PID-l 显示进程名和进程PID-o 进程起始ID-n 进程终止ID二、结束进程的命令 有kill、pkill、killall、xkill等:kill [信号代码] <进程PID>根据PID向进程发送信号,常用来结束进程,默认信号为 -9信号代码,可取值如下:-l [信号数字] 显示、翻译信号代码-9 , -KILL 发送 kill 信号退出-6 , -ABRT 发送 abort 信号退出-15 , -TERM 发送 Termination 信号-1 , -HUP 挂起-2 , -INT 从键盘中断,相当于 Ctrl+c-3 , -QUIT 从键盘退出,相当于 Ctrl+d-4 , -ILL 非法指令-11 , -SEGV 内存错误-13 , -PIPE 破坏管道-14 , -ALRM-STOP 停止进程,但不结束-CONT 继续运行已停止的进程-9 -1 结束当前用户的所有进程pkill <进程名>结束进程族。如果结束单个进程,请用 killkillall <进程名> killall和pkill 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill 来杀掉。xkill 在图形界面中点杀进程。当xkill运行时鼠标指针变为骷髅图案,哪个图形程序崩溃一点就OK了。如果您想终止xkill ,就按右键取消。比如当firefox 出现崩溃不能退出时,点鼠标就能杀死firefox 。xkill 调用方法:[root@localhost ~]# xkill来源: http://www.cnblogs.com/1024-wusuopuBUPT/archive/2012/02/16/2354132.htmllinux中pkill的简单用法pkill 和killall 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill 来杀掉。必要参数-f 显示完整程序-l 显示源代码-n 显示新程序-o 显示旧程序-v 与条件不符合的程序-x 与条件符合的程序选择参数-p<进程号>列出父进程为用户指定进程的进程信息-t<终端>指定终端下的所有程序-u<用户>指定用户的程序应用方法:#pkill 正在运行的程序名举例:Java代码 [root@localhost beinan]# pgrep -l gaim 2979 gaim [root@localhost beinan]# pkill gaim 也就是说:kill 对应的是 PIDpkill 对应的是COMMAND例如在Ubuntu中强制结束一个已成僵尸的名称为:firefox,PID为:1603的进程,可以如下 *** 作:方法一:(1)ctrl+alt+t,调出终端,输入 top,然后就可以看到现在系统的进程,是按占用资源从多到少排列的。找到要关掉的进程,记下该进程第一列的数字编号(假设是xx),然后输入q,退回终端。(2)输入:sudo kill xx(对应刚才的编号)。方法二:ctrl+alt+t,调出终端,输入:sudo pkill firefox范例1: 杀死指定进程Java代码 root@snail-hnlinux:~# ps -A //显示所有进程 PID TTY TIME CMD 1 ? 00:00:03 init 2 ? 00:00:00 kthreadd 3 ? 00:00:00 migration/0 4 ? 00:00:00 ksoftirqd/0 5 ? 00:00:00 watchdog/0 ……忽略部分 28382 ? 00:00:00 gvfsd-http 28391 ? 00:07:07 software-center 30467 ? 00:00:31 designer-qt4 30487 ? 00:00:06 gnome-terminal 30488 ? 00:00:00 gnome-pty-helpe 30489 pts/0 00:00:00 bash 30670 ? 00:00:00 debconf-communi 30749 pts/0 00:00:17 gedit 31155 ? 00:00:00 dhclient 31325 ? 00:00:01 sshd 31327 ? 00:00:00 sshd 31400 pts/1 00:00:00 bash 31485 pts/2 00:00:00 bash 31653 ? 00:00:00 aptd 31658 pts/1 00:00:00 ps root@snail-hnlinux:~# pidof sshd //查看与sshd相关进程 31327 31325 2095 root@snail-hnlinux:~# pkill -9 sshd //杀死指定进程 范例2:杀死同义终端下的进程Java代码 root@snail-hnlinux:~# pkill -t tty1 //杀死终端1下的所有进程 范例3: 杀死指定用户进程Java代码 root@snail-hnlinux:~# pkill -u hnlinux 范例4:反向选择Java代码 root@snail-hnlinux:~# pkill -vu hnlinux //杀死不属于hnlinux用户的所有进程————————————————版权声明:本文为CSDN博主「MrCoderr」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/coderder/article/details/78899823欢迎分享,转载请注明来源:内存溢出
评论列表(0条)