如何在Linux命令行中终止进程(kill命令)

如何在Linux命令行中终止进程

TIAP 2022-06-16 15:31 发表于山东

当你在使用 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 命令终止它。如下所示:

$  sleep 120 &[1] 125686
$ kill 125686[1] + terminated sleep 120

 

如果要使用终止信号,可以使用数值或信号本身:

$ 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 sleepguest     126061  0.0  0.0   6664   428 pts/3    S    10:14   0:00 sleep 50
$ sudo pkill -u guest

 

请注意,我使用 sudo 是因为我处理的进程不属于我当前的用户。

 

收录于合集 #Linux
 84
上一篇kill 和 killall 命令有什么区别?下一篇再写wget:7个使用 wget 命令的简便技巧
阅读 292
TIAP
51篇原创内容
 
写下你的留言
posted @ 2022-08-20 14:30  往事已成昨天  阅读(3845)  评论(0编辑  收藏  举报