如何在Linux命令行中终止进程(kill命令)
如何在Linux命令行中终止进程
当你在使用 Linux 系统的时候,突然有一个进程导致计算机的运行速度变慢,而这个进程又是一个不怎么重要的进程,所以你想要停止这个进程。
如果命令或者进程正在前台运行,则可以使用 Ctrl+C 终端快捷方式。但是,如果进程不可见(在后台运行),则可以使用专用命令终止它。
术语“终止进程”是指在执行过程中停止进程。如果知道进程ID(PID),可以使用如下命令:
kill <signal> <PID>
在上面的语法中,signal 指的是要发送用于终止的 kill 信号,PID 指的是进程的ID。
还有一个 killall 命令,在本文中也会涉及。
在开始终止进程之前,你需要了解一些事情。例如,有哪些终止信号可用,如何找到PID等。
我们先来了解一下信号 (signals) 。
Linux中的终止信号
当一个进程被操作系统或用户终止时,换句话说也就是当进程不是自己完成而结束时,它将被发送一个终端信号。
以下是可用的终止信号:
信号 |
数字值 |
描述 |
SIGHUP | 1 | 信号挂起:当控制它的终端关闭时,发送给进程。 |
SIGINT | 2 | 信号中断:当用户终止进程时发送给进程的信号。(例如Ctrl+X) |
SIGKILL | 9 | 信号终止:立即退出进程的信号,不允许它保存当前状态。 |
SIGTERM | 15 | 信号终止:发送到信号以请求终止进程。进程可以忽略此信号。但这是终止进程的首选方式,因为它可以在进程接收到SIGTERM时释放资源。 |
SIGSTOP |
19 (for x86, ARM and most others) 17 (for Alpha) 23 (for MIPS) 24 (for PARISC) |
信号停止:用于停止进程的信号,但稍后将恢复。 |
信号 9 和 15最常用,这里有一篇文章可了解 SIGKILL 和 SIGTERM 的区别 ( https://linuxhandbook.com/sigterm-vs-sigkill/ )。
获取进程的PID
你还需要知道要终止的流程的详细信息。使用 kill 命令时,必须提供进程的ID(PID)。你可以从进程名称中获取PID:
pidof exact_process_name
在Linux命令行中终止进程
我们先来了解 kill 命令,因为它比 killall 更常用。
使用 kill 命令
kill 命令要求你知道要终止的进程的ID以及终止信号(可选)。终止命令的语法很简单,上文也提到过:
kill [signal] <PID>
终止信号是可选的,如果没有提供信号,kill 默认发送SIGTERM(15)。
我启动了sleep命令的后台进程(它给了我一个PID),我们尝试使用 kill 命令终止它。如下所示:
[1] 125686
$ kill 125686
[1] + terminated sleep 120
如果要使用终止信号,可以使用数值或信号本身:
[1] 125746
$ kill -SIGKILL 125746
[1] + killed sleep 120
####----##-----####
$ sleep 120 &
[1] 125759
$ kill -9 125759
[1] + killed sleep 120
注:如果kill命令未指定信号,则默认情况下使用SIGTERM(15)。
使用 killall 命令
如果您不知道一个进程的PID是什么,或者要终止的进程有多个子进程,并且您希望同时终止子进程和父进程,那么可以使用killall命令。
killall [signal] <process-name>
与kill命令类似,指定终止信号是可选的。当未指定终止信号时,killall 将发送SIGTERM(15)以正常关闭所述进程。
为了演示 killall 的使用,我们将终止两个正在运行的sleep命令。
$ sleep 120 &
[1] 18609
$ sleep 2000 &
[2] 18612
$ killall sleep
[1]- Terminated sleep 120
[2]+ Terminated sleep 2000
此外,你可以使用 -e 标志来查找与进程名称匹配的PID。
使用 pkill 命令
另一个 kill 命令是 pkill 命令。它是 pgrep 和 kill 命令的“组合”。
killall 可以终止所有与进程名称匹配的进程。pkill 使用模式匹配来匹配进程并终止它们。如下语法:
pkill [options] pattern
pkill 命令提供以下几个选项:
-
-u: 特定用户所拥有的进程;
-
-x: 完全匹配模式的进程;
-
-signal: 指定终止信号(默认为SIGTERM)
假设我的计算机上有一个当前不应该运行任何进程的来宾用户,我想终止它们。该怎么做呢?
$ ps aux | grep sleep
guest 126061 0.0 0.0 6664 428 pts/3 S 10:14 0:00 sleep 50
$ sudo pkill -u guest
请注意,我使用 sudo 是因为我处理的进程不属于我当前的用户。