
🍃 予枫 :个人主页
📚 个人专栏 : 《Java 从入门到起飞》《读研码农的干货日常》
💻 Debug 这个世界,Return 更好的自己!
引言
作为Linux运维或开发人员,进程管理是必备基础技能------查看进程状态、控制进程启停、守护后台任务,每一步都关乎服务稳定性。但很多人用了很久Linux,仍分不清ps -ef和ps aux的区别,不懂kill -9与kill -15的差异,后台进程一断网就挂。今天就从实操出发,把进程查看、控制、守护的核心技巧讲透,新手也能直接上手,收藏这篇就够了!
文章目录
- 引言
- 一、进程查看:ps与top命令详解(必学基础)
-
- [1.1 ps -ef vs ps aux:别再用混这两个命令](#1.1 ps -ef vs ps aux:别再用混这两个命令)
-
- [ps -ef(系统级查看,侧重进程关系)](#ps -ef(系统级查看,侧重进程关系))
- [ps aux(用户级查看,侧重资源占用)](#ps aux(用户级查看,侧重资源占用))
- 小结
- [1.2 top面板解读:重点吃透Load Average](#1.2 top面板解读:重点吃透Load Average)
-
- 核心字段解读(必记)
-
- [关键:Load Average怎么看?](#关键:Load Average怎么看?)
- top实用操作技巧(快捷键)
- 二、进程控制:kill、前后台切换实操
-
- [2.1 kill命令:不止kill -9,不同信号有不同用法](#2.1 kill命令:不止kill -9,不同信号有不同用法)
- [2.2 前后台切换:&、jobs、fg、bg一键搞定](#2.2 前后台切换:&、jobs、fg、bg一键搞定)
- 三、后台进程守护:nohup与Systemd(避免进程挂掉)
-
- [3.1 nohup:简单粗暴,快速守护后台进程](#3.1 nohup:简单粗暴,快速守护后台进程)
- [3.2 Systemd:专业级守护,适合长期服务](#3.2 Systemd:专业级守护,适合长期服务)
- 四、总结
一、进程查看:ps与top命令详解(必学基础)
进程是Linux系统中正在运行的程序实例,想要管理进程,首先要学会"看见"进程------ps和top是最常用的两个查看命令,前者用于静态查看,后者用于动态监控,两者结合能覆盖绝大多数场景。
1.1 ps -ef vs ps aux:别再用混这两个命令
很多人习惯随手敲ps -ef或ps aux,但不知道两者的核心区别,其实关键在于输出格式和侧重点不同,按需选择更高效:
ps -ef(系统级查看,侧重进程关系)
- 核心用途:查看进程的完整信息,包括进程ID(PID)、父进程ID(PPID)、启动用户、启动时间、命令路径等,适合排查进程之间的依赖关系。
- 常用用法:直接执行命令,无需额外参数,输出简洁清晰。
bash
ps -ef
- 关键输出字段解读:
- UID:启动进程的用户
- PID:进程唯一ID(后续控制进程全靠它)
- PPID:父进程ID(了解进程由哪个程序启动)
- C:进程占用CPU的百分比
- STIME:进程启动时间
- TTY:进程关联的终端(? 表示无终端,通常是后台进程)
- TIME:进程占用CPU的总时间
- CMD:进程启动的完整命令(包括参数)
ps aux(用户级查看,侧重资源占用)
- 核心用途:查看进程的资源占用情况,包括CPU、内存使用率,适合排查哪个进程占用过多资源。
- 常用用法:同样直接执行,输出包含资源占用相关字段。
bash
ps aux
- 关键输出字段解读(补充与ps -ef的差异):
- %CPU:进程当前占用CPU的百分比
- %MEM:进程占用内存的百分比
- VSZ:进程占用的虚拟内存大小(单位:KB)
- RSS:进程占用的物理内存大小(单位:KB)
- STAT:进程状态(重点!后续会详解)
- START:进程启动时间(格式更简洁,如10:05)
小结
- 想查进程依赖、完整命令路径 → 用ps -ef
- 想查进程CPU、内存占用 → 用ps aux
- 实用技巧:结合grep过滤特定进程,比如查看nginx进程:
bash
ps -ef | grep nginx
ps aux | grep nginx
👉 提示:收藏这两个命令组合,日常排查进程效率翻倍!
1.2 top面板解读:重点吃透Load Average
如果说ps是"静态截图",top就是"动态视频"------实时监控进程资源占用,默认每3秒刷新一次,是排查高负载问题的核心工具。
执行top命令后,会看到如下面板(重点解读前5行):
top - 14:30:00 up 2 days, 8:15, 2 users, load average: 0.85, 0.92, 0.88
Tasks: 189 total, 1 running, 188 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.2 us, 2.1 sy, 0.0 ni, 92.5 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15916.4 total, 1234.5 free, 8976.3 used, 5705.6 buff/cache
MiB Swap: 16384.0 total, 16384.0 free, 0.0 used. 6218.7 avail Mem
核心字段解读(必记)
- 第一行(系统整体状态):
- 14:30:00:当前系统时间
- up 2 days, 8:15:系统运行时长
- 2 users:当前登录系统的用户数
- load average: 0.85, 0.92, 0.88(重点!):系统1分钟、5分钟、15分钟的平均负载
关键:Load Average怎么看?
很多人误以为负载平均值是CPU使用率,其实两者完全不同------负载平均值表示"等待CPU执行的进程数 + 正在CPU执行的进程数",数值越小,系统越空闲。
- 合理范围:负载平均值 ≤ CPU核心数(比如4核CPU,负载≤4属于正常)
- 异常判断:
- 1分钟负载 > CPU核心数,且5分钟、15分钟负载也持续偏高 → 系统负载过高
- 1分钟负载偏高,但5分钟、15分钟负载正常 → 临时高负载(比如瞬间启动多个程序)
- 举个例子:4核CPU,load average: 5.2, 4.8, 4.5 → 系统处于高负载状态,需要排查占用CPU过高的进程。
-
第二行(进程总数统计):
- total:系统总进程数
- running:正在运行的进程数(正常情况下只有1-2个,过多表示CPU压力大)
- sleeping:睡眠进程数(大多数进程处于此状态,无需关注)
- zombie:僵尸进程数(必须为0!不为0说明有进程异常退出,需要清理)
-
第三行(CPU使用率统计):
- us:用户空间进程占用CPU百分比(比如我们运行的Python、Java程序)
- sy:内核空间进程占用CPU百分比(系统自带进程,过高说明系统内核有异常)
- id:CPU空闲百分比(越低说明CPU压力越大)
- wa:CPU等待I/O的百分比(过高说明硬盘、磁盘I/O有瓶颈)
top实用操作技巧(快捷键)
- 按"P":按CPU使用率从高到低排序(快速找占用CPU最高的进程)
- 按"M":按内存使用率从高到低排序(快速找占用内存最高的进程)
- 按"k":输入PID,终止指定进程(无需退出top,直接kill)
- 按"q":退出top面板
👉 提示:记住这4个快捷键,用top排查问题效率提升一倍,建议点赞收藏,避免用到时找不到!
二、进程控制:kill、前后台切换实操
查看进程后,难免需要控制进程------终止异常进程、切换进程前后台、让进程在后台持续运行,这部分命令高频且实用,重点掌握kill信号和前后台切换技巧。
2.1 kill命令:不止kill -9,不同信号有不同用法
kill命令的核心是"向进程发送信号",终止进程只是其中一种用途,不同信号对应不同操作,盲目用kill -9容易导致数据丢失,建议按需选择。
常用kill信号(必记)
| 信号值 | 信号名称 | 作用 | 适用场景 |
|---|---|---|---|
| -15 | SIGTERM | 优雅终止进程(默认信号) | 正常终止进程,让进程有时间清理数据 |
| -9 | SIGKILL | 强制终止进程 | 进程异常卡死,无法用-15终止时 |
| -1 | SIGHUP | 重新加载进程配置 | 无需终止进程,刷新配置(如nginx、tomcat) |
实操案例(一看就会)
- 优雅终止进程(推荐首选):
bash
# 先通过ps命令找到进程PID,比如nginx的PID是1234
ps -ef | grep nginx
# 优雅终止,让nginx清理连接后退出
kill -15 1234
- 强制终止卡死进程:
bash
# 进程卡死,用-15无法终止时,用-9强制杀死(谨慎使用)
kill -9 1234
- 重新加载进程配置(无需终止):
bash
# 刷新nginx配置,无需重启服务
kill -1 1234
注意事项(避坑重点)
- 优先用kill -15,再用kill -9:kill -9会强制终止进程,可能导致进程正在处理的数据丢失(比如数据库进程)。
- 无法kill的进程:如果进程状态为"D"(不可中断睡眠),说明进程正在等待I/O(如硬盘读写),此时kill -9也无法终止,需先排查I/O问题。
2.2 前后台切换:&、jobs、fg、bg一键搞定
日常操作中,我们经常会遇到"执行一个长时间命令,终端被占用"的问题------比如用Python运行爬虫、启动服务,此时需要将进程切换到后台运行,释放终端。
4个核心命令(联动使用)
- &:启动进程时直接放入后台
bash
# 启动nginx,直接放入后台运行,终端可继续执行其他命令
nginx &
- 注意:这种方式放入后台的进程,一旦终端关闭(比如断开SSH连接),进程会被终止。
- jobs:查看当前后台运行的进程
bash
# 查看所有后台进程,会显示进程状态和PID
jobs
# 输出示例([1] 表示作业号,Running表示运行中,1234是PID)
[1]+ Running nginx &
- fg:将后台进程切换到前台
bash
# 将作业号为1的后台进程,切换到前台(如需操作进程,比如输入命令)
fg 1
# 若只有一个后台进程,直接输入fg即可
fg
- bg:将暂停的后台进程恢复运行
bash
# 若后台进程被暂停(状态为Stopped),用bg恢复运行
bg 1
实用场景案例(高频)
场景:用Python运行一个长时间爬虫,不想占用终端,且断开SSH后进程不终止。
bash
# 1. 启动爬虫时放入后台(加&)
python spider.py &
# 2. 查看后台进程,确认作业号
jobs
# 3. 若后续需要修改爬虫代码,先将进程切换到前台
fg 1
# 4. 修改完代码后,按Ctrl+Z暂停进程,再用bg恢复到后台
bg 1
👉 提示:前后台切换是Linux日常操作的高频技巧,尤其适合运维和开发人员,建议多实操几遍,形成肌肉记忆!
三、后台进程守护:nohup与Systemd(避免进程挂掉)
用&放入后台的进程,有一个致命问题------终端关闭(断开SSH、关闭终端窗口)时,进程会被终止,这显然不符合我们的需求(比如后台运行服务、爬虫)。
此时需要用到"进程守护"工具,重点掌握nohup(简单易用)和Systemd(专业稳定),按需选择。
3.1 nohup:简单粗暴,快速守护后台进程
nohup(no hang up)的作用是"忽略挂断信号",即使终端关闭,进程也能继续在后台运行,适合临时守护进程(比如运行几个小时的爬虫)。
实操用法(核心2种)
- 基础用法:nohup + 命令 + &
bash
# 用nohup守护Python爬虫,终端关闭后仍继续运行
nohup python spider.py &
- 执行后,会生成一个nohup.out文件,进程的输出日志(print内容)会写入这个文件。
- 自定义日志路径(推荐):
bash
# 将日志写入spider.log文件,避免nohup.out占用过多空间
nohup python spider.py > spider.log 2>&1 &
- 解读:> 表示重定向输出,2>&1 表示将错误日志也写入同一个文件。
注意事项
- nohup适合临时守护:如果系统重启,进程会被终止,无法自动恢复。
- 查看nohup守护的进程:用ps aux | grep 命令查看,比如ps aux | grep spider.py。
- 终止nohup守护的进程:找到PID后,用kill -15或kill -9终止即可。
3.2 Systemd:专业级守护,适合长期服务
如果需要长期守护进程(比如nginx、mysql、自己开发的服务),nohup就不够用了------Systemd是Linux系统自带的进程守护工具,支持开机自启、进程崩溃自动重启,是运维必备技能。
核心概念:Unit文件
Systemd通过"Unit文件"管理进程,Unit文件存放路径为 /etc/systemd/system/,后缀为 .service,我们只需要创建一个对应的Unit文件,就能实现进程守护。
实操案例:守护Python服务
假设我们有一个Python服务(app.py),需要长期后台运行,开机自启,崩溃自动重启,步骤如下:
- 创建Unit文件:
bash
# 编辑Unit文件,文件名自定义,后缀为.service(比如myapp.service)
vim /etc/systemd/system/myapp.service
- 写入以下内容(复制即可,修改对应路径):
ini
[Unit]
# 服务描述(自定义)
Description=My Python App Service
# 服务启动依赖(可选,比如依赖网络)
After=network.target
[Service]
# 启动用户(建议用普通用户,避免root权限风险)
User=root
# 服务启动命令(修改为自己的Python路径和脚本路径)
ExecStart=/usr/bin/python3 /root/app.py
# 进程崩溃后自动重启
Restart=always
# 重启间隔时间(秒)
RestartSec=3
# 日志输出路径(自定义)
StandardOutput=append:/var/log/myapp.log
StandardError=append:/var/log/myapp.err
[Install]
# 开机自启配置(关联multi-user.target)
WantedBy=multi-user.target
- 启用并启动服务:
bash
# 重新加载Systemd配置(修改Unit文件后必须执行)
systemctl daemon-reload
# 启动服务
systemctl start myapp.service
# 设置开机自启
systemctl enable myapp.service
Systemd常用命令(必记)
bash
# 启动服务
systemctl start myapp.service
# 停止服务
systemctl stop myapp.service
# 重启服务
systemctl restart myapp.service
# 查看服务状态(重点,排查服务是否正常运行)
systemctl status myapp.service
# 设置开机自启
systemctl enable myapp.service
# 取消开机自启
systemctl disable myapp.service
# 查看服务日志(排查服务启动失败原因)
journalctl -u myapp.service
小结
- 临时守护(几小时/几天) → 用nohup,简单易用
- 长期守护(开机自启、崩溃重启) → 用Systemd,专业稳定
👉 提示:如果是生产环境的服务,优先用Systemd,能大幅提升服务稳定性,建议收藏Unit文件模板,后续直接修改使用!
四、总结
本文从"查看-控制-守护"三个维度,详解了Linux进程管理的核心技巧,重点覆盖了ps、top、kill、nohup、systemctl等高频命令,解决了"进程查看分不清命令""后台进程容易挂""进程异常无法终止"等常见痛点。
核心要点回顾:
- 查看进程:ps -ef查依赖,ps aux查资源,top动态监控,重点吃透Load Average;
- 控制进程:优先用kill -15优雅终止,卡死用kill -9强制终止,前后台切换靠&、jobs、fg、bg;
- 守护进程:临时用nohup,长期用Systemd,Unit文件模板可直接复用。
Linux进程管理是基础但核心的技能,多实操、多踩坑(比如误杀进程),才能真正掌握。建议收藏本文,日常排查问题时随时查阅,也欢迎在评论区留言,分享你在进程管理中遇到的坑和技巧!