Linux kill 命令

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 
ps Linux 查找 Pid

要查找所有用户进程(包括守护进程、后台进程)的列表,请使用:

[email protected]:~# ps aux 

3. kill 命令——列出所有信号

了解所有可能的信号列表 kill 可以发送,使用 -l (列表)选项。

[email protected]:~# kill -l 
Linux 杀戮列表示例

在我的系统中,有 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 发送到 PID 101
  • kill -SIGNAME PID (前任。kill -SIGINT 101 将中断信号 (Ctrl + C) 发送到 PID 101 )
  • kill -NAME PID (前任。 kill -kill -300 发送中断信号 (Ctrl + C) 到 进程组 300 )

笔记: 如果 PID value 是负数,这意味着我们指的是一个进程组,而不仅仅是一个进程。 第三个例子说明了这一点。

如果 PID 值为 -1,这是一个特殊值,将信号发送到 每一个 过程 除了 killinit (init 是系统启动时产生的第一个进程,因此是其他所有进程的父进程)

Linux 终止进程示例Linux 终止进程示例

上面的示例使用 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 
杀死 9 命令 Linux 1杀死 9 命令 Linux

7. 按名称杀死进程

我们不能直接将进程名称传递给 kill,所以有两种方法可以实现:

7.1) 使用 killall

格式killall -SIGNAL NAME

killall 命令将信号发送到 全部 匹配给定名称的进程。

killall -9 bash 

这会发送 9 号信号(SIGKILL) 到与名称匹配的所有进程 bash.

killall 也可以在不指定的情况下使用 SIGNAL. 这将导致 SIGTERM 作为默认信号传递,这将终止所有匹配的进程。

例子:

killall vim 

7.2) 使用 pgrep

我们可以使用 pgrep 输出匹配的命令 PIDs 来自用户进程表的给定进程名称。

pgrep bash 

输出:

[email protected]:~# pgrep bash 26513 26944 27354 

pgrep 从给定用户的完整进程列表中搜索进程名称。

Pgrep 命令 Linux 示例Pgrep 命令 Linux 示例

您可以在使用后传递 PID 列表 pgrepkill.

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() 的联机帮助页