杀死进程

时间:2019-04-29 03:17:31  来源:igfitidea点击:

如何在Linux中终止进程

终止Linux中正在运行的进程

进程基本上是正在执行的程序。Linux中的每个进程都称为唯一的进程ID或简称PID。从另一个进程派生的任何进程都具有关联的父进程IDPPID。有关进程的说明,请访问我们的进程页面。在大多数情况下,进程将自行运行和终止,但是,并非总是如此。有时,程序可能会变得无响应并拒绝终止,甚至可能开始消耗大量的内存或CPU。发生这种情况时,您可能需要终止这些进程。在Linux中,有许多用于标识进程的命令。我们将介绍一些比较流行的方法,这些方法可以识别系统上正在运行的进程以及如何终止此类进程。

top命令

top可能是最常用的命令之一,用于快速识别正在运行的进程及其消耗的资源。

为了演示top,我们将运行一个会消耗大量CPU的小脚本。这将很容易发现在顶部。然后,我们将识别PID-进程ID,然后从交互式菜单屏幕中将其杀死。

#!/bin/bash
#This will cause the cat command to consume CPU :-(

CORES=1

for i in `seq 1 $CORES`
 do cat /dev/zero > /dev/null &
done

查看top输出。

kill procee

可以看到脚本的PID值为4235,并且正在消耗大量CPU。我们还可以看到正在运行的命令是cat

要终止此进程,我们只需在键盘上按字母k即可。然后,系统将提示您提供要杀死的PID

kill命令和信号说明

当您从命令行或交互式工具(例如top)执行kill命令时,实际上是在发送信号值。默认值为15。这些数字对应于系统用于处理进程的特定信号。

kill命令的语法

kill 信号或选项 PID

我们可以执行命令kill 4235。这将向进程发送表示SIGTERM的信号15
如果在kill命令之后未提供任何信号,则使用默认值15
执行命令kill -9 4235-9表示信号SIGKILL

查看所有可用到系统的信号的完整列表:

john@john-desktop:~/example$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

常用的kill选项

  1. kill -9 -1:杀死所有可以杀死的进程(您拥有的进程)。
  2. kill -l 9:将数字9转换为信号名称。(在这种情况下为SIGKILL)。
  3. kill 246 810 1214 1618:将默认信号SIGTERM发送到其PID指定的所有那些进程。

ps-进程显示命令

ps命令报告与进程有关的信息。

要使用标准语法查看系统上的每个进程:

ps -e
ps -ef
ps -eF
ps -ely

使用BSD语法查看系统上的每个进程:

ps ax
ps axu

打印进程树:

ps -ejH
ps axjf

ps命令示例

john@john-desktop:~/example$ ps
  PID TTY          TIME CMD
 3818 pts/0    00:00:00 bash
 4737 pts/0    00:00:00 ps

Linux如何搜索占用大量CPU的进程

显示消耗大量CPU的进程的另一种方法是将ps命令与sort命令结合使用:

john@john-desktop:~/example$ ps aux | sort -k 3,3 | tail -n 5
john      4640 31.0  0.0   4484   540 pts/0    R    20:48   3:47 cat /dev/zero
john      4643 31.0  0.0   4484   544 pts/0    R    20:48   3:44 cat /dev/zero
john      4637 31.4  0.0   4484   544 pts/0    R    20:48   3:50 cat /dev/zero
john      3928  3.4  4.1 558976 105880 ?       Sl   20:30   1:03 /opt/google/chrome/chrome 

在上面的示例中,我们将ps aux命令的输出通过管道进行排序。然后,我们在第三列CPU%上进行排序。为了将输出结果限制为几行,我们使用tail命令。

根据名称搜索进程

查找名为gedit的进程

john@john-desktop:~/example$ ps -ef | grep gedit
john      3792     1  1 21:16 ?        00:02:10 gedit
john      4758  3818  0 23:06 pts/0    00:00:00 grep --color=auto gedit

找到了两个进程,一个是PID为3792的实际进程gedit。另一个进程是我们的grep命令。如果我们想将grep进程排除在结果之外,可以使用-v选项:

john@john-desktop:~/example$ ps -ef | grep -v grep | grep edit
john      3792     1  1 21:16 ?        00:02:14 gedit

pgrep

pgrep是可用于查找进程(PID)的命令。从前面的示例中可以看到,我们将ps命令与grep一起使用来缩小搜索范围。pgrep可以用很多简单的格式

搜索用户john运行的进程名gedit

john@john-desktop:~/example$ pgrep -u john gedit
3792

killall-按名称杀死所有进程

命令killall向运行任何指定命令的所有进程发送信号以终止。如果未指定信号,则默认发送SIGTERM。如果您希望杀死具有相同名称的多个进程,此命令很有用。

如果要杀死下面cat命令的三个进程,则可以执行命令:kill 4637 4640 4643,但是,我们可以使用killall命令并执行killall cat

john@john-desktop:~/example$ ps aux | sort -k 3,3 | tail -n 5
john      3928  2.8  4.1 558976 106480 ?       Sl   20:30   1:06 /opt/google/chrome/chrome       
john      4640 30.8  0.0   4484   540 pts/0    R    20:48   6:26 cat /dev/zero
john      4643 30.8  0.0   4484   544 pts/0    R    20:48   6:24 cat /dev/zero
john      4637 31.0  0.0   4484   544 pts/0    R    20:48   6:29 cat /dev/zero
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

john@john-desktop:~/example$ killall cat

john@john-desktop:~/example$ ps aux | sort -k 3,3 | tail -n 5
john      4548  1.4  1.0 188948 26804 ?        Sl   20:41   0:24 gedit
john      1962  1.8  2.2 279096 57604 ?        Sl   20:17   0:58 compiz
root      1198  2.6  0.6  25624 16480 tty7     Ss+  20:16   1:24 /usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none
john      3928  2.8  4.1 558976 106480 ?       Sl   20:30   1:06 /opt/google/chrome/chrome