CodeGym /课程 /Docker SELF /结束进程:命令 `kill`,`killall`,`pkill`

结束进程:命令 `kill`,`killall`,`pkill`

Docker SELF
第 2 级 , 课程 5
可用

1. 结束进程

今天我们更进一步,学习一些能有效结束进程的命令。准备好吧,因为你对那些“卡死”程序的耐心很快就要到头了!

在 Linux 中,每个启动的程序或命令都是一个进程。不过,如果有程序卡死了,占用着 100% CPU 资源或者干脆不正常工作了呢?作为管理员(或开发者)的任务就是介入并中止这个“叛逆”的进程。在 Linux 中,我们有一整个工具库来解决这个问题:killkillallpkill。别担心,虽然这些名字听起来很吓人,但我们不是要到处破坏,而是用一种优雅的方式来恢复秩序。


2. 命令 kill

基础知识

命令 kill 通过进程ID (PID) 结束一个进程。PID 是系统分配给每个进程的唯一编号。例如,如果想结束PID为1234的进程,可以使用以下命令:

kill 1234

Linux本质上很民主,所以命令kill不是直接命令进程“去死”,而是发送一个结束请求。这种请求被称为“信号”。默认情况下,kill发送信号SIGTERM(15)。

什么是信号?

Linux使用信号与进程通讯。这就像发送带有不同意图的明信片一样:

  • SIGTERM (15): “请结束。” 这是一个礼貌地请求进程停止运行。
  • SIGKILL (9): “好了,够了,你被解雇了!” 强制结束进程。
  • SIGHUP (1): “嘿,重新加载配置吧。” 用于在不停止进程的情况下重新启动某些进程。

强制终止进程的例子:

kill -9 1234

如果一个进程在收到SIGTERM后拒绝结束,您可以发送更强制的信号——SIGKILL

如何获取进程的PID?

要使用kill命令,您需要知道进程的PID。熟悉的命令pstophtop可以提供帮助。例如,ps aux命令的输出将显示所有正在运行的进程:

ps aux | grep firefox

此查询将找到Firefox进程并显示其PID。

进程已结束,可以松一口气。但如果有多个"卡住"的进程呢?这时命令killallpkill就派上用场了。


3. 命令 killall

批量终止的便利性

命令 killall 允许终止所有具有特定名称的进程。你不需要手动查找PID,一切变得更加简单。例如,如果你想关闭所有打开的Firefox实例:

killall firefox

和命令 kill 类似,killall 给进程发送信号。你可以指定特定的信号:

killall -9 firefox

实用建议

使用类似killall 的命令时要小心。如果你不小心指定了过于通用的进程,例如killall python,你可能会终止所有运行中的Python应用,包括服务器任务或重要脚本。

支持哪些信号?

对于所有命令 kill, killallpkill,可以使用以下命令查看可用信号列表:

kill -l

4. 命令 pkill

按名字(或部分名字)查找进程

命令 pkill 的工作方式类似于 killall,但更灵活。它允许结束符合特定模式的进程。例如:

pkill fire

这个命令会结束所有名字中包含 "fire" 的进程。这在进程名很长或你只知道部分名字时非常方便。

结束用户的进程

你可以结束属于特定用户的进程。例如:

pkill -u username

这会结束属于用户 username 的所有进程。

对比 kill, killallpkill

命令 特点
kill 通过 PID 结束进程。精确操作。
killall 结束所有指定名称的进程。适合批量关闭。
pkill 按名称或模式结束进程。支持额外参数,如用户名。

5. 实操:终止进程

让我们把学到的东西实际操作一下。首先启动几个长期运行的进程:

sleep 300 &
sleep 400 &
sleep 500 &

这些命令会创建三个不同等待时间的后台进程。现在你可以试试使用 kill, killallpkill 命令。

  1. 使用 ps 命令查看所有运行中的 sleep 进程:
ps aux | grep sleep

你会看到每个进程的PID。

  1. 终止某个PID,比如1234:
kill 1234
  1. 直接终止所有 sleep 进程:
killall sleep
  1. 再启动一些 sleep 进程,然后使用 pkill 终止:
pkill sl

6. 常见错误和重要注意事项

如果你试图终止一个你没有权限的进程(比如另一个用户的进程),命令会返回错误。你需要超级用户权限 (sudo)。例如:

sudo kill 1234

另一个容易引起混淆的地方是使用过于激进的信号 -9。这相当于直接拔掉电脑的电源:系统没有机会释放资源或保存数据。仅在万不得已的情况下使用 SIGKILL

在使用 killallpkill 时要小心,尤其是在管理服务器时。盲目终止进程可能会导致重要数据丢失。


为什么了解终止进程的命令很重要?

这些命令有广泛的应用范围,从结束卡住的程序到管理服务器进程。在面试中,了解 killpkill 可能会成为你能力的一个重要指标,尤其是系统管理或后端工作相关时。

你可以利用这些知识创建脚本,自动终止失控的进程或释放占用的端口。例如,在启动占用8080端口的服务器之前,可以使用:

pkill -f "port 8080"

这些命令的灵活性和强大功能使它们成为每个 Linux 专家的必备工具。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION