Linux 下终止进程的命令

关键字

Linux, kill, process, bash

概述

当我们寻找 Linux 命令最权威的讲解时,可以选择 Linux 自带的手册,或者某一两本早年出版的大部头英文编程手册书籍(亚马逊五星评价)。

Linux 下终止进程有好几个命令,命令行有 killkillallpkillskill 等,图形界面终止进程还有 xkill。在某些发行版下,可能只有 kill 命令,因此需要掌握只用 kill 终止进程的办法。

方法〇:ps & kill

这种方法是最原始的方法,第一步使用 ps aux 命令列举所有进程,第二步,人参与识别要 kill 的 PID (进程号 ),再用 kill PID 来终止进程,这里需要人去判断并记忆 PID。

其中,进程的命令参数,可以有三种风格:

  • BSD 风格:不使用短横线,如 ps aux
  • UNIX 风格:使用一根短横线,如 ps -ef
  • GNU 长选项风格:使用两根短横线

方法一:kill | grep | cut 和 命令管道

ps -e | grep PROC_NAME | grep -v grep | cut -c 1-4 | xargs kill -9
  • ps -e:e 即 every,以标准格式查看所有进程,其中 1- 4 列是进程号
  • |:命令管道,即把 | 左方命令的输出作为 | 右方命令的输入
  • grep PROC_NAME:查找包含 PROC_NAME 的行
  • grep -v grep:查找不包括 grep 的行
  • cut -c 1-4:每列取 1-4 个字符宽度
  • xargs kill -9:xargs 即把输入 作为 kill -9 的参数

整个连起来,就是“以标准格式列进程,查找含有 KEYWORD 的列,且不含 grep 的列,取 1- 4 列(PID),作为 kill -9 命令的输入参数”,这种方法最常用。

ps -ef | grep PROC_NAME | grep -v grep | cut -c 9-15 | xargs kill -9

与上述类似,因为 ps 选项中多了 f,相应的 PID 移到了第二列,即 9-15 个字符。

ps -ef | grep PROC_NAME | grep -v grep | awk '{print $2}' | xargs kill -9

这里 awk ‘{print $2}’ 即取结果第二列,这条更明确,但略难输入。

方法二:killall

[root@carbon ~]# killall
Usage: killall [-Z CONTEXT] [-u USER] [ -eIgiqrvw ] [ -SIGNAL ] NAME...
       killall -l, --list
       killall -V, --version

  -e,--exact          require exact match for very long names
  -I,--ignore-case    case insensitive process name match
  -g,--process-group  kill process group instead of process
  -y,--younger-than   kill processes younger than TIME
  -o,--older-than     kill processes older than TIME
  -i,--interactive    ask for confirmation before killing
  -l,--list           list all known signal names
  -q,--quiet          don't print complaints
  -r,--regexp         interpret NAME as an extended regular expression
  -s,--signal SIGNAL  send this signal instead of SIGTERM
  -u,--user USER      kill only process(es) running as USER
  -v,--verbose        report if the signal was successfully sent
  -V,--version        display version information
  -w,--wait           wait for processes to die
  -Z,--context REGEXP kill only process(es) having context
                      (must precede other arguments)

使用方法,比如杀死 httpd 进程为:

killall httpd

方法三:pkill

类似 killall,可配合 pgrep 来使用,例如杀死 httpd 进程的过程如下。

[root@carbon ~]# pgrep -l httpd
1224 httpd
1229 httpd
1230 httpd
1231 httpd
[root@carbon ~]# pkill httpd

值得一提的是,在早年 Linux 中,killall 和 pkill 后的进程名只按 15 位来识别,更可靠的办法是使用 pidof 获得进程号

方法四:pidof

这种方法是是直观容易记忆的方法。pidof 对旧版本超过 15 位文件名的 Linux 也支持的较好。

kill -9 `pidof firefox`

总结

Linux 自带数不清的命令,若想真明白,真要好几年。对于活在 Linux 下的程序员来说,最直接的方法就是阅读手册。本文即列举了实现相同目的杀掉进程的不同命令,其中的细节,留待读者多多执行 man 命令了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注