下面我将从最简单到最复杂的情况,详细介绍各种终止命令的方法。

终止前台正在运行的命令
这是最常见的情况,当你运行一个命令后,它会占用你的终端,直到它自己执行完毕。
Ctrl + C
这是最常用、最标准的方法。
-
作用:发送一个
SIGINT(Signal Interrupt) 信号给当前正在运行的进程,这个信号是请求进程中断当前操作并正常退出,大多数命令都会响应这个信号并停止。 -
如何使用:在终端中,直接按下
Ctrl + C组合键。
(图片来源网络,侵删) -
示例:
# 运行一个长时间运行的命令,ping ping google.com # 在终端按下 Ctrl + C,你会看到类似下面的输出: # PING google.com (142.250.196.68) 56(84) bytes of data. # 64 bytes from lhr4s01-in-f14.1e100.net (142.250.196.68): icmp_seq=1 ttl=116 time=15.2 ms # 64 bytes from lhr4s01-in-f14.1e100.net (142.250.196.68): icmp_seq=2 ttl=116 time=15.1 ms # ^C # <-- 在这里按下 Ctrl + C # --- google.com ping statistics --- # 2 packets transmitted, 2 received, 0% packet loss, time 1001ms # rtt min/avg/max/mdev = 15.123/15.167/15.211/0.044 ms
Ctrl + Z
这个方法不会终止命令,而是让它暂停并放到后台。
-
作用:发送一个
SIGTSTP(Signal Terminal Stop) 信号,请求进程暂停(挂起)执行,进程会停止在当前状态,但不会被杀死。 -
如何使用:在终端中,按下
Ctrl + Z组合键。
(图片来源网络,侵删) -
后续操作:
- 查看暂停的作业:使用
jobs命令。 - 让作业在后台继续运行:使用
bg(background) 命令。 - 让作业回到前台运行:使用
fg(foreground) 命令。 - 终止暂停的作业:使用
kill命令(见下文)。
- 查看暂停的作业:使用
-
示例:
# 再次运行 ping ping google.com # 按下 Ctrl + Z # [1]+ Stopped ping google.com # <-- 输出表示 ping 已被暂停 # 现在你可以输入其他命令了 echo "Hello, I'm still here." # 查看当前作业 jobs # [1]+ Stopped ping google.com # 终止这个作业(方法见下文) kill %1
注意:
Ctrl + Z只是暂停,如果关闭终端,这些被暂停的作业通常也会被终止。
终止后台或已暂停的作业
当你使用 Ctrl + Z 或 & 符号将一个命令放到后台后,它就成了一个“作业”。
使用 kill 命令
kill 是专门用来向进程发送信号的命令,默认情况下,它发送 SIGTERM (Signal Terminate) 信号,请求进程正常退出。
-
如何使用:
- 用
jobs命令找到作业的 ID(如[1])。 - 使用
kill %<作业ID>来终止它。
- 用
-
示例:
# 启动一个后台作业 sleep 1000 & [1] 12345 # <-- 系统给出了进程ID (PID) # 查看所有作业 jobs # [1]+ Running sleep 1000 & # 终止作业 [1] kill %1 # 再次查看作业状态 jobs # [1]+ Terminated sleep 1000
使用 pkill 命令
pkill 根据进程的名称来发送信号,更方便,但可能不够精确。
-
如何使用:
pkill [进程名] -
示例:
# 启动一个名为 my_long_script.sh 的脚本 ./my_long_script.sh & # 使用 pkill 终止所有名为 "my_long_script.sh" 的进程 pkill my_long_script.sh
使用 killall 命令
killall 与 pkill 类似,也是根据进程名终止,但它是 Linux 系统上特有的命令,不是所有 Unix-like 系统都有。
- 如何使用:
killall [进程名] - 示例:
./my_long_script.sh & killall my_long_script.sh
强制终止命令
有些时候,Ctrl + C 或 kill 发送的 SIGTERM 信号可能不起作用,因为程序没有正确处理这个信号,这时就需要强制终止。
方法:Ctrl + \ 或 kill -KILL
这个方法会发送 SIGKILL 信号。
-
作用:
SIGKILL是一个“必杀”信号,它不能被程序捕获或忽略,操作系统会直接、粗暴地收回该进程的所有资源,立即终止它,这可能会导致数据丢失或文件损坏,因此应作为最后手段使用。 -
如何使用:
- 前台进程:按下
Ctrl + \(反斜杠)。 - 后台进程:
kill -KILL <PID>或kill -9 <PID>(-9是SIGKILL的信号编号)。
- 前台进程:按下
-
示例:
# 假设一个不响应 Ctrl+C 的“僵尸”进程 ping google.com # 按下 Ctrl + C,它没反应 # 按下 Ctrl + \ # # <-- 会看到类似 "Quit (core dumped)" 的输出,进程被强制终止
终止一个 Shell 会话中的所有命令
如果你想退出当前整个 Shell 会话,并终止其中所有相关的作业。
exit
- 作用:正常退出当前 Shell,它会先尝试终止所有由该 Shell 启动的子进程和作业,然后关闭 Shell。
- 如何使用:直接输入
exit并回车。
logout
- 作用:与
exit类似,用于退出登录 Shell(你通过 SSH 登录后使用的 Shell)。 - 如何使用:直接输入
logout并回车。
Ctrl + D
- 作用:发送一个
EOF(End-Of-File) 字符,当 Shell 在等待输入时收到EOF,它会解释为“输入结束”,然后退出。 - 如何使用:在命令行输入的起始位置,直接按下
Ctrl + D。
总结表格
| 组合/命令 | 信号 | 作用 | 适用场景 |
|---|---|---|---|
Ctrl + C |
SIGINT |
中断请求,命令通常正常退出。 | 终止前台正在运行的、可响应中断的命令。 |
Ctrl + Z |
SIGTSTP |
暂停命令,并将其放到后台。 | 临时中断一个命令,以便稍后继续或切换到其他任务。 |
kill %<job_id> |
SIGTERM (默认) |
请求进程正常退出。 | 终止后台或已暂停的作业(jobs 查看ID)。 |
kill -9 <PID> |
SIGKILL |
强制、立即终止,无法被忽略。 | 当 Ctrl + C 或 kill 无效时,作为最后手段。 |
Ctrl + \ |
SIGQUIT |
强制终止,并可能生成核心转储文件。 | 终止前台进程,是 SIGKILL 的另一种触发方式。 |
exit / logout |
N/A | 退出当前 Shell 会话。 | 退出整个终端会话,并关闭所有相关进程。 |
Ctrl + D |
EOF |
表示输入结束,触发 Shell 退出。 | 退出 Shell 会话的快捷方式。 |
最佳实践:
- 首选
Ctrl + C:用于终止前台任务。 - 善用
Ctrl + Z:当你需要临时切换任务时。 - 慎用
kill -9:只在命令无响应时使用,因为它可能导致数据不一致。 - 清理后台作业:退出 Shell 之前,最好用
jobs检查一下,用kill清理不需要的后台任务。
