zoukankan      html  css  js  c++  java
  • killall 、kill 、pkill 命令区别

    转至:https://zhuanlan.zhihu.com/p/87904563

    killall 命令

    Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name)。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,
    我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一,是一个很好用的命令。

    1.命令格式

    killall [参数] [进程名]

    2.命令参数

    -Z 只杀死拥有scontext 的进程
    -e 要求匹配进程名称
    -I 忽略小写
    -g 杀死进程组而不是进程
    -i 交互模式,杀死进程前先询问用户
    -l 列出所有的已知信号名称
    -q 不输出警告信息
    -s 发送指定的信号
    -v 报告信号是否成功发送
    -w 等待进程死亡
    –help 显示帮助信息
    –version 显示版本显示

    3.范例
    1:杀死所有同名进程 

    killall nginx 
    killall -9 bash

    2.向进程发送指定信号

    killall -TERM ngixn
    
    或者 killall -KILL nginx

    KILL 命令
    Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程。kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程。

    1.命令格式

    kill [参数] [进程id]

    2.命令参数

    -l 信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称
    -a 当处理当前进程时,不限制命令名和进程号的对应关系
    -p 指定kill 命令只打印相关进程的进程号,而不发送任何信号
    -s 指定发送信号
    -u 指定用户

    1.kill命令可以带信号号码选项,也可以不带。如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kill向进程发送特定的信号。例如:

    kill -2 123

    它的效果等同于在前台运行PID为123的进程时按下Ctrl+C键。但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号。
    2.kill可以带有进程ID号作为参数。当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息。
    3.可以向多个进程发信号或终止它们。
    4.当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下Enter键使shell的命令提示符再次出现时,才会显示出来。
    5.应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。发送信号时必须小心,只有在万不得已时,才用kill信号(9),因为进程不能首先捕获它。要撤销所有的后台作业,可以输入kill 0。因为有些在后台运行的命令会启  动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时,使用kill 0来终止所有由当前shell启动的进程,是个有效的方法。
    2.范例
    实例1:列出所有信号名称

    kill -l

    输出:

    [root@localhost test6]# 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) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+439) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+1247) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-1451) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-1055) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-659) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX

    说明:只有第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
    9
    [root@localhost test6]# kill -l SIGKILL
    9
    [root@localhost test6]# kill -l TERM
    15
    [root@localhost test6]# kill -l SIGTERM
    15
    [root@localhost test6]#

    实例3:先用ps查找进程,然后用kill杀掉命令:

    kill 3268
    [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

    实例4:彻底杀死进程命令:

    kill9 3268 # -9 强制杀掉进程

    ps:init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。 其它所有进程都是init进程的子孙。init进程是不可杀的!

    PKILL命令
    pkill 和killall 应用方法差不多,也是直接杀死运行中的程式;如果你想杀掉单个进程,请用kill 来杀掉。

    应用方法:
    #pkill 正在运行的程式名

    centos killall安装

    yum install psmisc

     

    一般的杀死进程过程如下

    $ ps -ef | grep django-admin.py | grep -v grep
    501 20060 1 0 0:00.11 ttys001 0:00.38 python django-admin.py runserver 0.0.0.0:8002
    501 20063 20060 0 0:00.35 ttys001 0:01.07 python django-admin.py runserver 0.0.0.0:8002
    
    $ kill -TERM 20060 20063$ ps -ef | grep django-admin.py | grep -v grep

    常规篇:
    用linux的终端命令

    首先,用ps查看进程,方法如下:

    $ ps -ef
    ……
    smx 1822 1 0 11:38 ? 00:00:49 gnome-terminal
    smx 1823 1822 0 11:38 ? 00:00:00 gnome-pty-helper
    smx 1824 1822 0 11:38 pts/0 00:00:02 bash
    smx 1827 1 4 11:38 ? 00:26:28 /usr/lib/firefox-3.6.18/firefox-bin
    smx 1857 1822 0 11:38 pts/1 00:00:00 bash
    smx 1880 1619 0 11:38 ? 00:00:00 update-notifier
    ……
    smx 11946 1824 0 21:41 pts/0 00:00:00 ps -ef

    或者:

    $ ps -aux
    
    ……
    
    smx 1822 0.1 0.8 58484 18152 ? Sl 11:38 0:49 gnome-terminal
    
    smx 1823 0.0 0.0 1988 712 ? S 11:38 0:00 gnome-pty-helper
    
    smx 1824 0.0 0.1 6820 3776 pts/0 Ss 11:38 0:02 bash
    
    smx 1827 4.3 5.8 398196 119568 ? Sl 11:38 26:13 /usr/lib/firefox-3.6.18/firefox-bin
    
    smx 1857 0.0 0.1 6688 3644 pts/1 Ss 11:38 0:00 bash
    
    smx 1880 0.0 0.6 41536 12620 ? S 11:38 0:00 update-notifier
    
    ……
    
    smx 11953 0.0 0.0 2716 1064 pts/0 R+ 21:42 0:00 ps -aux

    此时如果我想杀了火狐的进程就在终端输入:

    $ kill -s 9 1827
    其中-s 9 制定了传递给进程的信号是9,即强制、尽快终止进程。各个终止信号及其作用见附录。
    1827则是上面ps查到的火狐的PID。

    简单吧,但有个问题,进程少了则无所谓,进程多了,就会觉得痛苦了,无论是ps -ef 还是ps -aux,每次都要在一大串进程信息里面查找到要杀的进程,看的眼都花了。

    进阶篇:
    改进1:

    把ps的查询结果通过管道给grep查找包含特定字符串的进程。管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。

    $ ps -ef | grep firefox
    smx 1827 1 4 11:38 ? 00:27:33 /usr/lib/firefox-3.6.18/firefox-bin
    smx 12029 1824 0 21:54 pts/0 00:00:00 grep --color=auto firefox

    这次就清爽了。然后就是

    $kill -s 9 1827


    还是嫌打字多?

    改进2——使用pgrep:
    一看到pgrep首先会想到什么?没错,grep!pgrep的p表明了这个命令是专门用于进程查询的grep。

    $ pgrep firefox
    1827

    看到了什么?没错火狐的PID,接下来又要打字了:

    $kill -s 9 1827

    改进3——使用pidof:
    看到pidof想到啥?没错pid of xx,字面翻译过来就是 xx的PID。

    $ pidof firefox-bin
    1827

    和pgrep相比稍显不足的是,pidof必须给出进程的全名。然后就是老生常谈:

    $kill -s 9 1827

    无论使用ps 然后慢慢查找进程PID 还是用grep查找包含相应字符串的进程,亦或者用pgrep直接查找包含相应字符串的进程PID,然后手动输入给kill杀掉,都稍显麻烦。有没有更方便的方法?有!
    改进4:

    $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”会强行杀掉指定进程。

    难道你不想抱怨点什么?没错太长了

    改进5:
    知道pgrep和pidof两个命令,干嘛还要打那么长一串!

    $ pgrep firefox | xargs kill -s 9

    改进6:

    $ ps -ef | grep firefox | awk '{print $2}' | xargs kill -9
    kill: No such process

    有一个比较郁闷的地方,进程已经正确找到并且终止了,但是执行完却提示找不到进程。
    其中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和kill!pkill=pgrep+kill。

    $pkill - firefox说明:”-9” 即发送的信号是9,pkill与kill在这点的差别是:pkill无须 “s”,终止信号等级直接跟在 “-“ 后面。之前我一直以为是 “-s 9”,结果每次运行都无法终止进程。
    -f The pattern is normally only matched against the process name. 
    When -f is set, the full command line is used.Which means, for example, if we see these lines in ps
    
    aux:
    apache 24268 0.0 2.6 388152 27116 ? S Jun13 0:10 /usr/sbin/httpd
    apache 24272 0.0 2.6 387944 27104 ? S Jun13 0:09 /usr/sbin/httpd
    apache 24319 0.0 2.6 387884 27316 ? S Jun15 0:04 /usr/sbin/httpd

    We can kill them all using the pkill -f option:

    $pkill -f httpd

    改进10——killall:

    killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。

    $killall -9 firefox
  • 相关阅读:
    Maven——配置阿里云的镜像仓库
    Eclipse——配置代码提示
    设计模式——一步步实现《单例模式》
    JAVA实现二叉平衡树
    简单设计模式——状态模式 (召唤师峡谷版)
    简单设计模式——观察者模式
    JavaScript获取鼠拖动选中的内容(InMemories笔记)
    图解数据结构——二叉查找树/二叉排序树
    SpringMVC详细笔记(一) —— 几步快速搭建一个SpringMVC程序
    【Java虚拟机10】ClassLoader.getSystemClassLoader()流程简析
  • 原文地址:https://www.cnblogs.com/my-first-blog-lgz/p/13889298.html
Copyright © 2011-2022 走看看