这 杀 Linux中的命令用于向一个进程或一组进程发送信号。 不幸的是,这个名字被选为 kill
,而不是信号,不一定要杀死一个进程。 正如我们将看到的,根据传递给它的值,它会向 Process / Process 组发送适当的信号。
1. Linux kill 命令基本语法
它是一个 C 函数,在 #include <signal.h>
POSIX 系统中的头文件。
原函数的形式为 kill(pid_t pid, int signal)
, 在哪里 pid
是进程的进程 ID(一组进程的组 ID),并且 signal
是要传递的信号类型。
Linux 命令非常相似,格式如下:
[email protected]:~# kill -SIGNAL PID
2.查找进程的PID
要获得 PID
的目标进程,使用 ps
命令找到对应的 PID
为进程名称。
[email protected]:~# ps
要查找所有用户进程(包括守护进程、后台进程)的列表,请使用:
[email protected]:~# ps aux
3. kill 命令——列出所有信号
了解所有可能的信号列表 kill
可以发送,使用 -l
(列表)选项。
[email protected]:~# kill -l
在我的系统中,有 64 种可能的信号选择 kill
. 每个信号的功能可以参考手册页 signal
. (man signal
)
在这里,进一步的例子证明了 kill
使用常见信号的命令,例如 SIGINT
(Ctrl+C) 和 SIGKILL
(Ctrl+Z)。
4. Linux kill 命令——向进程发送信号
一个信号可以以多种格式传递:
- 使用信号数(正整数)
- 将信号名称与
SIG
字首 (SIGINT
为了INT
(中断)信号) - 使用不带
SIG
字首 (INT
,KILL
)
我们可以使用以下任何格式向进程/进程组发送信号:
kill -SIGNO PID
(前任。kill -5 101
将信号编号 5 发送到 PID101
kill -SIGNAME PID
(前任。kill -SIGINT 101
将中断信号 (Ctrl + C) 发送到 PID101
)kill -NAME PID
(前任。kill -kill -300
发送中断信号 (Ctrl + C) 到 进程组300
)
笔记: 如果 PID
value 是负数,这意味着我们指的是一个进程组,而不仅仅是一个进程。 第三个例子说明了这一点。
如果 PID
值为 -1
,这是一个特殊值,将信号发送到 每一个 过程 除了 kill
和 init
(init
是系统启动时产生的第一个进程,因此是其他所有进程的父进程)
上面的示例使用 kill -SIGKILL PID
命令。 我们得到所有的列表 PID
使用 ps
命令,然后发送信号杀死它。
5.kill的默认信号
kill
也可以在不指定的情况下使用 SIGNAL
. 这将导致 SIGTERM
作为默认信号传递,这将终止所有匹配的进程。
例子:
kill 21000
这将终止 PID 为 21000 的进程。
6.杀死-9命令
这 kill -9 PID
命令用于发送信号编号 9 (SIGKILL
) 到 PID
. 这会杀死相应的进程。
kill -9 21000
7. 按名称杀死进程
我们不能直接将进程名称传递给 kill
,所以有两种方法可以实现:
7.1) 使用 killall
格式: killall -SIGNAL NAME
这 killall
命令将信号发送到 全部 匹配给定名称的进程。
killall -9 bash
这会发送 9 号信号(SIGKILL
) 到与名称匹配的所有进程 bash
.
killall
也可以在不指定的情况下使用 SIGNAL
. 这将导致 SIGTERM
作为默认信号传递,这将终止所有匹配的进程。
例子:
killall vim
7.2) 使用 pgrep
我们可以使用 pgrep
输出匹配的命令 PID
s 来自用户进程表的给定进程名称。
pgrep bash
输出:
[email protected]:~# pgrep bash 26513 26944 27354
pgrep
从给定用户的完整进程列表中搜索进程名称。
您可以在使用后传递 PID 列表 pgrep
到 kill
.
pgrep vim | xargs kill -SIGINT
这将杀死所有调用的用户进程 vim
(通过传递 SIGINT
对他们所有人)
如果您只想匹配第一个进程 id,则使用有限匹配 grep
(这 -m
选项)。
[email protected]:~# pgrep bash | grep -m1 '' 26513
同样,如果要匹配前两个,请使用:
[email protected]:~# pgrep bash | grep -m2 '' 26513 26944
8. kill vs killall 命令
kill
用于发送信号到 进程 ID/组 ID, 尽管killall
用于向与给定进程匹配的进程列表发送信号 名称.killall
将信号发送到可能的多个进程,而kill
仅将信号发送到单个进程/进程组。
9.杀死一个用户的所有进程
我们可以杀死属于一个用户的所有进程 killall
, 与 -u
/ (--user
) 选项。
[email protected]:~# killall --user USERNAME
这将杀死调用的用户的所有进程 USERNAME
.
10. 其他常用的kill Signals
信号名称 | 信号值 | 功能 |
SIGHUP |
1 | 挂断 |
SIGINT |
2 | 键盘中断 |
SIGKILL |
9 | 杀死进程 |
SIGTERM |
15 | 终止进程 |
SIGSTOP |
17、19、23 | 停止进程 |
11. 结论
在这篇文章中,我们了解了 kill
命令,用于向进程和进程组发送各种类型的信号。 这是程序员从命令行终止和暂停程序的一种快速简便的方法,因此如果您不熟悉此命令,请务必这样做,因为它是一个非常方便的命令行工具。 希望你发现这篇文章有用!
12. 参考文献
- kill() 的联机帮助页