kill 和 pgrep 和 pidof 和 awk 和 pkill 和 killall

Shell 专栏收录该内容
45 篇文章 1 订阅

 

Mastering the “Kill” Command in Linuxhttps://www.maketecheasier.com/kill-command-in-linux

 

 

无论你使用哪种操作系统,你一定会遇到某个行为失常的应用,它把自己锁死并拒绝关闭。在Linux(还有Mac),你可以用一个"kill"命令强制终结它。在这个教程中,我们将展示给你多种方式使用"kill"命令终结应用。

 


Kill命令和信号

当你执行一个"kill"命令,你实际上发送了一个信号给系统,让它去终结不正常的应用。总共有60个你可以使用的信号,但是基本上你只需要知道SIGTERM(15)和SIGKILL(9)。

你可以用这个命令看到所有信号的列表:kill -l 

  • SIGTERM : 此信号请求一个进程停止运行。此信号是可以被忽略的。进程可以用一段时间来正常关闭,一个程序的正常关闭一般需要一段时间来保存进度并释放资源。换句话说,它不是强制停止。
  • SIGKILL : 此信号强制进程立刻停止运行。程序不能忽略此信号,而未保存的进度将会丢失。

使用"kill"的语法是:kill [信号或选项] PID(s) 
默认信号(当没有指定的时候)是SIGTERM。当它不起作用时,你可以使用下面的命令来强制kill掉一个进程:
        kill SIGKILL PID 
或者:
        kill -9 PID 
这里"-9"代表着SIGKILL信号。
如果你不知道应用的PID,仅需要运行这个命令:ps ux  或者 ps -aux 或者 ps -ef 
它会显示所有正在运行的应用还有应用的PID。

例如,要 kill 掉 Chrome,我会运行命令:kill -9 3629 
也可以在同一时间  kill 多个进程:kill -9 PID1 PID2 PID3 

 


PKill

"pkill" 命令是 “按名字” 杀掉进程。允许使用扩展的正则表达式和其它匹配方式。你现在可以使用应用的进程名kill掉它们,而不是使用PID。例如,要 kill 掉 Firefox 浏览器,只需要运行命令:pkill firefox 

使用正则表达式匹配的话,你可以输入进程名的部分字符,比如:pkill fire 

为了避免 kill 掉错误的进程,你应该用一下 " pgrep -l [进程名] " 列表来匹配进程名称。

 


Killall

killall 同样使用 进程名 替代 PID,并且它会 kill 掉所有的同名进程。例如,如果你正在运行多个Firefox浏览器的实例,可以用命令把它们全部 kill 掉:( killall 和 pkill 是相似的,不过如果给出的进程名不完整,killall 会报错。pkill 不需要完整的进程名就行)

结束 firefox 进程:killall firefox
在Gnome中,你可以使用这个命令重启 Nautilus:killall nautilus 

 


xkill

xkill 是图形方式kill一个应用。当你在终端键入"xkill",你的光标将立刻变成一个"十字"。你只需要做的是在不正常的应用上点击一下,它就会立刻kill掉这个应用。如果你经常用的话,你也可以添加一个键盘快捷键来激活xkill。

 


 

结论

当应用不正常而导致系统挂起的时候,人们往往重启计算机并且再一次开启所有的任务。而有了这些"kill"命令,你将能够更好的处理不正常的应用,从而避免导致系统崩溃。当你不想因一个不正常的进程而导致服务器宕机时,它尤其的有用。

 

 

 

实例 

 

实例1:列出所有信号名称
kill -l
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号:
HUP    1    终端断线
INT     2    中断(同 Ctrl + C)
QUIT    3    退出(同 Ctrl + \)
TERM   15    终止
KILL    9    强制终止
CONT   18    继续(与STOP相反, fg/bg命令)
STOP    19    暂停(同 Ctrl + Z)

实例2:得到指定信号的数值
[root@localhost test6]# kill -l KILL
[root@localhost test6]# kill -l SIGKILL
[root@localhost test6]# kill -l TERM
[root@localhost test6]# kill -l SIGTERM
[root@localhost test6]#

实例3:先用ps查找进程,然后用kill杀掉
[root@localhost test6]# ps -ef | grep vim 
root      3268  2884  0 16:21 pts/1    00:00:00 vim install.log
root      3370  2822  0 16:21 pts/0    00:00:00 grep vim
[root@localhost test6]# kill 3268 
[root@localhost test6]# kill 3268 

实例4:彻底杀死进程
[root@localhost test6]# ps -ef | grep vim 
root      3268  2884  0 16:21 pts/1    00:00:00 vim install.log
root      3370  2822  0 16:21 pts/0    00:00:00 grep vim
[root@localhost test6]# kill –9 3268 
[root@localhost test6]# kill 3268 

实例5:杀死指定用户所有进程
[root@localhost ~]# kill -9 $(ps -ef | grep peidalinux) 
[root@localhost ~]# kill -u peidalinux

实例6:init进程是不可杀的
[root@localhost ~]# ps -ef | grep init
root         1     0  0 Nov02 ?        00:00:00 init [3]                  
root     17563 17534  0 17:37 pts/1    00:00:00 grep init
[root@localhost ~]# kill -9 1
[root@localhost ~]# kill -HUP 1
[root@localhost ~]# ps -ef | grep init
root         1     0  0 Nov02 ?        00:00:00 init [3]                  
root     17565 17534  0 17:38 pts/1    00:00:00 grep init
[root@localhost ~]# kill -KILL 1
[root@localhost ~]# ps -ef|grep init
root         1     0  0 Nov02 ?        00:00:00 init [3]                  
root     17567 17534  0 17:38 pts/1    00:00:00 grep init
[root@localhost ~]#

 
ps -ef  或者 ps aux        // 查看进程的方法: 
kill -s 9 15572    或者    kill -9 15572    
        -s 9 指定传递给进程的信号是9即强制终止进程。假设15572用ps查到的火狐(firefox)的PID。
        kill -9, 这个强大和危险的命令迫使进程在运行时突然终止,进程在结束后不能自我清理。
        危害是导致系统资源无法正常释放,一般不推荐使用,除非其他办法都无效。 
        当使用此命令时,一定要通过ps -ef确认没有剩下任何僵尸进程。只能通过终止父进程来消除僵尸进程。
        如果僵尸进程被init收养,问题就比较严重了。杀死init进程意味着关闭系统。 
        如果系统中有僵尸进程,并且其父进程是init,而且僵尸进程占用了大量的系统资源,那么就需要在某个时候重启机器以清除进程表了。 


进阶篇:
		
改进 1 —— grep
把ps的查询结果通过管道传给grep,查找包含特定字符串的进程。
管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。
例如: homer@ubuntu:~$ ps -aux | grep firefox
直接找到firefox进程PID, 输入: kill  -s  9  15572

改进 2 —— pgrep
pgrep的p表明了这个命令是专门用于进程查询的grep
例如: homer@ubuntu:~$ pgrep firefox

改进 3 —— pidof
pidof命令,表示 pid of xx,字面翻译过来就是 xx的PID。和pgrep相比稍显不足的是,pidof必须给出进程的全名。
例如: homer@ubuntu:~$ pidof firefox

改进 4  —— kill + xargs
$ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9
说明:
“grep firefox”的输出结果是,所有含有关键字“firefox”的进程。
“grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。
“cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。
“xargs kill -s 9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -s 9”命令的参数,并执行该命令。“kill -s 9”会强行杀掉指定进程。

杀死进程的方式有以下几种:
a) ps -ef | grep firefox | grep -v grep | awk '{print $2}' | xargs kill -s 9
b) pgrep firefox | xargs kill -s 9
c) pidof firefox | xargs kill -s 9
或
d) kill -s 9 `ps -ef | grep firefox | grep -v grep | awk '{print $2}'`
e) kill -s 9 `pgrep firefox`
f) kill -s 9 `pidof firefox`

改进 5 
知道pgrep和pidof两个命令,干嘛还要打那么长一串!
$ pgrep firefox | xargs kill -s 9

改进6 —— grep + awk
$ ps -ef | grep firefox | grep -v grep | awk '{print $2}' | xargs kill -9
其中awk '{print $2}' 的作用就是打印(print)出第二列的内容。
ps输出的第二列正好是PID。就把进程相应的PID通过xargs传递给kill作参数,杀掉对应的进程。

改进7:
难道每次都要调用xargs把PID传递给kill?答案是否定的:
$kill -s 9 `ps -aux | grep firefox | awk '{print $2}'`

改进8:
没错,命令依然有点长,换成pgrep。
$kill -s 9 `pgrep firefox`

改进9——pkill:
pkill 类似于 pgrep, pkill 表示 pgrep+kill。即 pkill=pgrep+kill。
$pkill -9 firefox    // 或者 pkill firefox
说明:"-9" 即发送的信号是9,pkill与kill在这点的差别是:pkill无须 “s”,终止信号等级直接跟在 “-“ 后面。

改进10——killall:
killall命令, 杀死同一进程组内的所有进程,其允许指定要终止的进程的名称,而非PID。
killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。
pkill或者pgrep只要给出进程名的一部分就可以终止进程。
$killall firefo
firefo: no process found
$killall firefox
$killall -9 firefox

kill
杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志。
例如: # kill -pid  
注释: 标准的kill命令,默认采用信号(signal)号是15,通常都能达到目的,终止有问题的进程,并把进程的资源释放给系统。
       然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源。
	   为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。  

kill -l
例如: kill -l PID 
-l 选项, 告诉kill命令用好像启动进程的用户已注销的方式结束进程。
当使用该选项时,kill命令也试图杀死所留下的子进程。但这个命令也不是总能成功--或许仍然需要先手工杀死子进程,然后再杀死父进程。 

kill -HUP
有时候只想简单的停止和重启进程。
例如: # kill -HUP PID 
该命令让Linux和缓的执行进程关闭,然后立即重启。
在配置应用程序的时候,这个命令很方便,在对配置文件修改后需要重启进程时就可以执行此命令。 

 

踢掉登录用户和用户进程

linux系统root用户可强制踢制其它登录用户
首先可用$w命令查看登录用户信息,显示信息如下:
[root@Wang ~]# w
10:01:23 up 1:23, 3 users, load average: 0.71, 0.58, 0.57
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty2     -                09:59    1:53   0.01s 0.01s -bash
root     pts/0    :0.0             10:01    0.00s 0.03s 0.00s w
wangbo   pts/2    192.168.0.196    09:42   18:50   0.01s 0.01s -bash
[root@Wang ~]#pkill -kill -t pts/1

[root@Wang ~]# ps -ef | grep pts/0
root     15846 15842 0 10:04 pts/0    00:00:00 bash
root     15876 15846 0 10:06 pts/0    00:00:00 ps -ef
root     15877 15846 0 10:06 pts/0    00:00:00 grep pts/0
踢掉用户的命令:
kill -9 15846


结束掉某个用户的所有进程。初学者一般会先查询出用户的所有pid,然后一条条kill结束掉,或者写一个脚本。
实际上结束的方法有很多,这边总结了下面4种方法,以kill用户zhangnq为例。
1. pkill方式
# pkill -u zhangnq
2. killall方式
# killall -u zhangnq
3. ps方式 ps列出zhangnq的pid,然后依次kill掉,比较繁琐。
# ps -ef | grep zhangnq | awk '{ print $2 }' | xargs kill -9
4. pgrep方式 pgrep -u参数查出用户的所有pid,然后依次kill
# pgrep -u zhangnq | xargs kill -9

 

 

  • 0
    点赞
  • 0
    评论
  • 4
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值