在Linux操作系统中,程序以进程的形式运行,停止程序本质上是终止对应的进程,Linux提供了多种终止进程的方式,适用于不同的场景(如前台进程、后台进程、系统服务等),掌握这些方法能帮助用户高效管理系统资源,本文将详细介绍Linux中停止程序的各类方法,并结合实例说明操作步骤和注意事项。

Linux进程终止的基本逻辑
在终止进程前,需理解Linux的信号机制:进程通过信号接收指令,不同信号代表不同操作。
- 信号15(TERM):默认终止信号,请求进程正常退出,进程会执行清理操作(如关闭文件、释放资源)后再终止。
- 信号9(KILL):强制终止信号,进程无法忽略,系统直接回收资源,可能导致未保存的数据丢失或资源残留(如锁未释放)。
- 信号2(INT):等同于
Ctrl+C,用于终止前台进程。
终止进程的基本步骤为:定位进程 → 发送信号 → 验证终止结果。
停止程序的具体方法
通过快捷键终止前台进程
若程序在前台运行(如通过终端直接启动),可直接使用终端快捷键:
Ctrl+C:发送信号2(INT),请求进程正常退出,适用于大多数交互式程序(如ping、vim)。
示例:运行ping baidu.com后按Ctrl+C,终止ping进程。Ctrl+Z:发送信号18(STOP),暂停进程并将其转入后台(进程未终止,处于“挂起”状态),后续可通过jobs查看后台任务,用fg恢复前台、bg后台运行,或kill终止。
示例:运行sleep 100后按Ctrl+Z,再通过kill %1(任务编号为1)终止后台进程。
使用kill命令终止进程(需进程ID,PID)
kill是基础终止命令,需结合进程ID(PID)使用,通过ps、pgrep等工具获取PID。
-
基本语法:
kill [信号选项] PID- 默认发送信号15(TERM):
kill 1234(PID为1234的进程)。 - 强制终止(信号9):
kill -9 1234(适用于进程无响应或无法正常退出时)。
- 默认发送信号15(TERM):
-
获取PID的方法:
ps aux:列出所有进程,通过grep过滤目标进程(如ps aux | grep nginx)。pgrep:直接通过进程名获取PID(如pgrep nginx返回所有nginx进程的PID)。pidof:通过进程名获取PID(如pidof nginx)。
示例:终止所有名为
myscript.py的进程
pgrep myscript.py | xargs kill -15 # 先尝试优雅终止
使用pkill和killall按进程名终止(无需手动查PID)
-
pkill:按进程名、用户、终端等条件批量终止进程,支持正则匹配。
语法:pkill [选项] 进程名
常用选项:-u:指定用户(如pkill -u username nginx)。-f:匹配完整命令行(如pkill -f "python myscript.py")。-9:强制终止(如pkill -9 nginx)。
-
killall:按进程名终止所有同名进程,功能类似pkill但语法更简单(不支持正则)。
语法:killall [选项] 进程名
示例:killall -9 nginx(强制终止所有nginx进程)。
使用systemctl管理系统服务(适用于systemd服务)
若程序是通过systemd管理的系统服务(如nginx、mysql),应使用systemctl命令终止,而非直接kill,以确保服务依赖关系和资源释放正常。
-
基本语法:
- 停止服务:
systemctl stop 服务名.service(如systemctl stop nginx.service)。 - 禁止自启动:
systemctl disable 服务名.service(防止服务重启后自动运行)。 - 强制终止(不推荐):
systemctl kill 服务名.service(直接发送信号9,仅用于服务无响应时)。
示例:停止并禁用防火墙服务
sudo systemctl stop firewalld.service sudo systemctl disable firewalld.service
- 停止服务:
通过图形界面工具终止进程
Linux桌面环境(如GNOME、KDE)提供图形化系统监视工具,适合不熟悉命令行的用户:
- GNOME系统监视器:活动概览中搜索“监视器”,或通过
gnome-system-monitor命令启动,找到进程后右键选择“结束”。 - KDE系统守护进程:通过
ksysguard启动,可查看进程树并终止目标进程。 - 任务管理器(如XFCE):右键任务栏选择“任务管理器”,定位进程后点击“结束任务”。
使用top/htop交互式终止进程
top和htop是动态进程监视工具,支持在界面内直接终止进程:

top:启动后按k键,输入PID后回车,选择信号(默认15,输入9强制终止)。htop:启动后选中进程,按F9键,选择信号后回车(更直观,支持鼠标操作)。
Linux常用进程终止命令对比
为方便用户快速选择合适的方法,以下通过表格总结主要命令的适用场景和特点:
| 命令/工具 | 功能描述 | 常用参数/选项 | 适用场景 | 示例 |
|---|---|---|---|---|
Ctrl+C |
终止前台进程 | 无 | 交互式前台程序(如ping、vim) |
运行ping baidu.com后按Ctrl+C |
Ctrl+Z |
暂停前台进程并转入后台 | 无 | 需临时挂起前台进程 | 运行sleep 100后按Ctrl+Z |
kill |
通过PID终止进程 | -9(强制)、-15(默认) |
已知PID,需精准终止单个进程 | kill -9 1234 |
pkill |
按进程名/条件批量终止进程 | -u(用户)、-f(完整命令)、-9 |
批量终止同名进程或按条件筛选 | pkill -f "python script.py" |
killall |
按进程名终止所有同名进程 | -9(强制) |
进程名明确,需批量终止 | killall -9 nginx |
systemctl |
管理systemd服务 | stop(停止)、disable(禁用自启) |
系统服务(如nginx、mysql) |
systemctl stop nginx.service |
top/htop |
交互式终止进程 | top按k,htop按F9 |
动态监视进程并实时终止 | htop → 选中进程 → F9 |
注意事项
- 优先使用信号15(TERM):避免直接使用
kill -9,强制终止可能导致数据损坏或资源残留(如临时文件、锁未释放),若进程无响应,再尝试信号9。 - 谨慎终止系统关键进程:避免误杀内核进程(如PID为1的
systemd)或系统服务,可通过ps -ef | grep [进程名]确认进程归属。 - 后台进程管理:通过
nohup或&启动的后台进程,需用jobs、ps或pgrep定位PID后再终止,而非直接关闭终端(终端关闭会导致进程收到SIGHUP信号而终止)。 - 服务终止的替代方案:对于数据库等服务(如
mysql),优先使用服务自身的关闭命令(如mysqladmin shutdown),而非直接kill,确保数据持久化。
相关问答FAQs
Q1:为什么用kill -9强制终止程序后,有些资源(如文件、端口)没有被释放?
A:kill -9发送的是SIGKILL信号,该信号不可忽略且无法被进程捕获,系统会直接强制终止进程并回收其内存资源,但进程无法执行任何清理操作(如关闭文件描述符、释放网络端口、删除临时文件等),若进程在终止前持有资源(如数据库锁、网络连接),这些资源可能残留,解决方法:
- 使用
lsof命令查看残留资源(如lsof -i :8080查看8080端口占用情况)。 - 重启相关服务或系统,强制释放资源。
- 避免频繁使用
kill -9,优先尝试kill -15,或通过服务自身关闭命令正常退出。
Q2:如何停止一个被nohup或&后台运行的程序?
A:nohup(no hang up,使进程忽略终端关闭信号)和&(将进程转入后台)常用于长时间运行的任务,停止这类程序需分两步:
- 定位进程PID:
- 使用
jobs查看后台任务列表(如jobs -l),显示任务编号和PID(如[1] 1234 Running nohup python script.py &)。 - 或通过
ps aux | grep "script.py"过滤目标进程(注意排除grep自身进程,可使用ps aux | grep "script.py" | grep -v grep)。
- 使用
- 终止进程:
- 若通过
jobs获取PID,可直接用kill PID(如kill 1234)。 - 若进程较多,可用
pkill按进程名终止(如pkill -f "script.py")。 - 若进程无响应,强制终止
kill -9 PID。
- 若通过
示例:停止nohup python server.py &启动的后台服务
ps aux | grep "server.py" | grep -v grep | awk '{print $2}' | xargs kill -15 # 先尝试优雅终止
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/22624.html