Linux进程管理全解:进程查看、后台任务、信号控制实战教程
前言
Linux 系统中所有程序运行都依托进程,服务器运维、程序调试、服务器故障排查都离不开进程管理。很多新手只会简单使用ps、kill,一旦遇到远程后台任务中断、进程杀不掉、占用 CPU 等高负载场景就束手无策。
本文附上带真实操作时间的命令,兼顾理论 + 实操,适合运维入门、面试复习。
一、基础概念:分清程序、软件、进程、线程
本节核心重点
静态 vs 动态:程序是磁盘静态文件,进程是运行中的动态实例,核心区分点;
fork 创建机制:Linux 所有进程都是父进程 fork 生成,bash 是绝大多数用户命令的父进程;
操作系统四大职能:进程调度(任务管理)是运维核心,其余三块作为底层基础;
进程自带独立资源空间,线程共享进程资源,多线程更轻量化。
概念详解
程序:磁盘上静态、未运行的可执行文件,不占用 CPU、内存资源。
软件:完整套装,包含程序、配置文件、帮助手册、依赖包,如 httpd、nginx。
进程:程序加载运行后的实例,会占用 CPU、内存、磁盘 IO、网络端口,是操作系统资源调度最小单位。
线程:进程内部轻量执行单元,同一进程内线程共享内存空间。
进程组成(必记字段)
独立内存地址空间、运行权限凭据、多条执行线程、运行状态。
进程运行环境
局部 / 全局变量、CPU 调度上下文、打开的文件、占用端口。
fork 机制
终端执行任意命令,当前 bash 父进程调用 fork 生成子进程,示例:
[lizihan@centos7 ~11:41:09]$sleep5sleep 是 bash 的子进程。
操作系统四大核心职责
任务管理:进程 / 线程调度(本文核心)
设备管理:网卡、硬盘、显示器硬件驱动
文件系统:文件存储、权限、目录管理
内存管理:内存分配、回收、Swap 交换分区
二、进程查看:ps 命令全场景实操
本节核心重点
ps 三种参数风格:UNIX (-)、GNU (--)、BSD (无横杠),日常混用无冲突;
高频命令区分:
ps -ef看完整信息、ps axu看资源占用、ps axf看父子进程树;关键字段释义(面试必考):PID 进程 ID、PPID 父进程 ID、% CPU/% MEM 资源占用、TTY 终端;
筛选用法:按用户、终端、进程名过滤,支持自定义输出字段、按 CPU / 内存排序排查高负载。
1. 基础查看命令讲解
ps -e:查看系统全部进程
重点:仅展示基础字段,适合快速确认进程是否存在
[lizihan@centos7 ~11:41:09]$ps-ePID TTY TIME CMD1? 00:00:02 systemd2? 00:00:00 kthreadd字段释义:
PID:进程唯一 ID
TTY:绑定终端,
?代表无终端后台守护进程TIME:进程累计占用 CPU 时长(不是程序运行时间,高频易错点)
CMD:执行命令名称
ps -ef:运维最常用完整进程信息
重点:新增 UID、PPID、STIME,排查父子进程、进程启动时间首选
[lizihan@centos7 ~11:41:09]$ps-ef|head-n5UIDPIDPPIDC STIME TTY TIME CMD root10008:45 ? 00:00:02 /usr/lib/systemd/systemd root20008:45 ? 00:00:00[kthreadd]新增关键字段:
UID:运行进程的用户 ID
PPID:父进程 PID(杀不死进程、僵尸进程排查核心)
C:CPU 瞬时占用率
STIME:进程启动时间
2. 精准筛选进程
按用户筛选进程
重点:排查某个用户后台跑的脚本、占用资源
[lizihan@centos7 ~15:09:39]$ps-ulizihan u按终端筛选进程
重点:多 SSH 登录时,只看当前窗口任务
[lizihan@centos7 ~15:12:36]$ps-tpts/0 ups axu:BSD 风格,完整资源信息
重点:自带 % CPU、% MEM,排查服务器高负载第一命令
[lizihan@centos7 ~11:41:09]$psaxups -C 按进程名查询
重点:无需 grep 过滤,直接匹配程序名
[lizihan@centos7 ~14:41:11]$ps-CsleepPID TTY TIME CMD9168? 00:00:00sleep# 自定义展示字段,只看PID、状态、命令[lizihan@centos7 ~14:41:58]$ps-Csleep-opid,stat,command PID STAT COMMAND9177Ssleep603. 树形展示父子进程 ps jf /ps axf
核心重点
直观打印进程树,一眼看清父进程、子进程依赖,解决 “kill 后进程自动重启” 的关键工具
[lizihan@centos7 ~15:14:14]$psjfPPIDPID PGID SID TTY TPGID STATUIDTIME COMMAND9951995699569956pts/19956Ss+10000:00-bash9903990799079907pts/010045Ss10000:00-bash990710037100379907pts/010045S10000:00\_sleep12324. 自定义字段 + 进程排序
重点
--sort -%cpu负号代表降序,服务器 CPU 打满时快速定位异常进程
# 指定只查看PID、CPU、内存、执行命令[lizihan@centos7 ~11:41:09]$ps-opid,%cpu,%mem,command1159# 按CPU使用率降序(排查高负载进程)[lizihan@centos7 ~11:41:09]$psaxu--sort-%cpu三、Shell 作业控制:前台 / 后台进程管理
本节核心重点
前台进程:独占终端,接收
Ctrl+C/Ctrl+Z;后台进程不占用终端,但交互程序无法后台运行;核心快捷键 / 命令:
&后台启动、Ctrl+Z暂停、bg %任务号后台运行、fg %任务号切前台;jobs 只查看当前终端任务,跨终端看不到;
远程长时间任务痛点:关闭 SSH 终端会发送 SIGHUP 杀死进程,两种解决方案
nohup、screen;面试考点:passwd、vim 这类需要输入交互的程序放后台会自动暂停。
前置测试脚本
[root@centos7 ~]# cat << 'EOF' > /usr/local/bin/study#!/bin/bashwhiletruedoecho"$(date): I'm studying [$@]">>study.logsleep1doneEOF[root@centos7 ~]# chmod +x /usr/local/bin/study完整实操分步讲解
1. & 直接后台运行程序
重点:命令末尾加 &,shell 返回任务号 + PID,终端可继续输入命令
[lizihan@centos7 ~11:41:09]$ study Linux&[1]5754# jobs:查看当前终端全部后台任务[lizihan@centos7 ~11:42:02]$jobs[1]+ Running study Linux&2. 前台进程暂停、转入后台运行
流程讲解:前台运行 → Ctrl+Z 暂停(放入后台停止状态)→ bg 唤醒后台运行
# 前台运行,占用终端[lizihan@centos7 ~11:42:14]$ study Python# 按下 Ctrl+Z 暂停程序^Z[2]+ Stopped study Python[lizihan@centos7 ~11:42:28]$jobs[1]- Running study Linux&[2]+ Stopped study Python# bg %2:把2号任务放到后台持续运行[lizihan@centos7 ~11:42:34]$bg%2[2]+ study Python&[lizihan@centos7 ~11:43:02]$jobs[1]- Running study Linux&[2]+ Running study Python&# 新增后台任务[lizihan@centos7 ~11:43:09]$ study MySQL&[3]59503. fg 切回前台,Ctrl+C 终止
重点:后台任务无法用 Ctrl+C 杀死,必须切前台或用 kill 发信号
[lizihan@centos7 ~11:43:15]$fg%1 study Linux ^C[lizihan@centos7 ~11:43:24]$fg%2 study Python ^C[lizihan@centos7 ~11:43:31]$fg%3 study MySQL ^C[lizihan@centos7 ~11:43:36]$jobs特殊场景:交互命令无法后台运行
原理
后台进程无法读取终端输入,需要键盘交互的程序(passwd、vim)放入后台会直接暂停
[lizihan@centos7 ~13:33:34]$passwd&[1]7265Changing passwordforuser lizihan.[1]+ Stoppedpasswd生产痛点:关闭 SSH 终端进程不销毁
原理
关闭 SSH 会发送 SIGHUP 信号,终端内所有后台任务全部销毁,适合补丁、备份、编译等耗时任务。
方案 1:nohup
重点:忽略 SIGHUP 挂断信号,输出自动存入 nohup.out,简单轻量,临时任务首选
[lizihan@centos7 ~]$nohupstudy English&方案 2:screen(推荐长期任务)
重点:创建独立虚拟会话,断开终端不影响任务,支持重新连接会话,多任务管理
# 安装screen(CentOS7)[root@centos7 ~]# curl -s -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo[root@centos7 ~]# yum install -y screen# 创建会话[lizihan@centos7 ~]$screen[lizihan@centos7 ~]$sleep1234# 新开终端查看会话列表[lizihan@centos7 ~]$screen-ls# 重新连接断开的会话[lizihan@centos7 ~]$screen-r会话ID# 关闭会话[lizihan@centos7 ~]$screen-X-S会话ID quit四、进程信号管理:kill、pgrep、pkill 实战
本节核心重点
信号是发给进程的软中断,用于暂停、唤醒、终止进程;
5 个高频信号(必背):
2 SIGINT:Ctrl+C 优雅终止前台
9 SIGKILL:强制杀死,进程无法捕获 / 忽略,万不得已再用
15 SIGTERM:kill 默认信号,优雅关闭,推荐优先使用
18 SIGCONT:唤醒暂停进程
19 SIGSTOP:暂停进程运行
kill 两种用法:
kill %任务号操作当前终端 jobs、kill PID操作全局进程;pgrep 批量匹配进程 PID,pkill 批量发信号,支持按进程名、用户、终端、父进程批量杀;
批量清理卡死进程思路:ps 过滤 PID+awk 提取,配合 kill 批量强制销毁。
1. 查看系统全部信号
[lizihan@centos7 ~14:11:26]$kill-l1)SIGHUP2)SIGINT3)SIGQUIT4)SIGILL5)SIGTRAP6)SIGABRT7)SIGBUS8)SIGFPE9)SIGKILL10)SIGUSR111)SIGSEGV12)SIGUSR213)SIGPIPE14)SIGALRM15)SIGTERM16)SIGSTKFLT17)SIGCHLD18)SIGCONT19)SIGSTOP20)SIGTSTP2. kill 操作任务 / 进程 PID
实操讲解
# 后台启动两个测试任务[lizihan@centos7 ~14:11:38]$ study Linux&[2]7696[lizihan@centos7 ~14:11:38]$ study Python&[3]7723# 19号信号:暂停任务[lizihan@centos7 ~14:11:57]$kill-19%2[lizihan@centos7 ~14:12:38]$jobs[2]+ 已停止 study Linux# 18号信号:恢复运行[lizihan@centos7 ~14:15:09]$kill-18%2# 默认15号SIGTERM,优雅终止进程[lizihan@centos7 ~14:15:17]$kill-SIGTERM%2[lizihan@centos7 ~14:15:42]$jobs[2]- 已终止 study Linux# 直接kill等价kill -15[lizihan@centos7 ~14:15:45]$kill%3[lizihan@centos7 ~14:16:15]$jobs[3]+ 已终止 study Python# 通过PID杀死全局进程[lizihan@centos7 ~14:16:18]$ study MySQL&[1]8803[lizihan@centos7 ~14:16:34]$psaxu|grepstudy lizihan88030.00.01132881440pts/0 S14:160:00 /bin/bash /usr/local/bin/study MySQL[lizihan@centos7 ~14:16:53]$kill8803[lizihan@centos7 ~14:17:12]$jobs[1]+ 已终止 study MySQL3. pgrep + pkill 批量管理进程
核心区分
pgrep 只查询 PID,不杀进程;pkill 直接批量发送信号,无需手动提取 PID。
示例 1:按进程名批量杀死 sleep
[lizihan@centos7 ~15:07:43]$sleep1231&sleep1232&sleep1233&[1]9459[2]9460[3]9461# pgrep:只输出PID[lizihan@centos7 ~15:07:54]$ pgrepsleep945994609461# pgrep -l:同时输出PID+进程名[lizihan@centos7 ~15:08:08]$ pgrep-lsleep9459sleep9460sleep9461sleep# pkill 批量终止所有sleep进程[lizihan@centos7 ~15:08:28]$pkillsleep示例 2:按终端、父进程批量杀进程
-t 终端:杀死当前窗口所有后台任务-P PPID:杀死某个父进程下全部子进程,批量清理子进程树
# 根据终端匹配进程[lizihan@centos7 ~15:12:07]$sleep1231&sleep1232&[1]10014[2]10015[lizihan@centos7 ~15:12:36]$tty/dev/pts/0[lizihan@centos7 ~15:12:39]$ pgrep-tpts/0-l9907bash10014sleep10015sleep[lizihan@centos7 ~15:12:56]$pkill-tpts/0[1]- 已终止sleep1231[2]+ 已终止sleep1232# 根据父进程PID杀死所有子进程[lizihan@centos7 ~15:14:10]$sleep1231&sleep1232&[3]10043[4]10044[lizihan@centos7 ~15:14:23]$pkill-P9907[2]已终止sleep1232[3]- 已终止sleep1231[4]+ 已终止sleep1232# root杀死指定用户全部进程(强制注销用户)[root@centos7 ~15:11:15]# pkill -u lizihan示例 3:批量清理 yum 卡死进程
重点
yum 多次 Ctrl+Z 暂停会占用 yum 锁,无法新安装,需要批量强制销毁;grep -v grep过滤掉自身 grep 进程,awk 提取第二列 PID
[root@centos7 ~15:15:10]# yum install httpd# 连续三次Ctrl+Z暂停yum^Z[1]+ Stopped yuminstallhttpd[root@centos7 ~15:15:20]# yum install httpd^Z[2]+ Stopped yuminstallhttpd[root@centos7 ~15:15:40]# yum install httpd^Z[3]+ Stopped yuminstallhttpd# 过滤所有yum进程PID[root@centos7 ~15:16:08]# ps axu | grep yum |grep -v grep | awk '{print $2}'101031011810127# 强制批量杀死yum进程[root@centos7 ~15:16:41]# pkill -9 yum[2]- Killed yuminstallhttpd[1]- Killed yuminstallhttpd[3]+ Killed yuminstallhttpd五、登录用户查询:whoami /who/w /last
本节核心重点
whoami:最简单,查看当前执行命令的用户;
who:查看所有在线登录用户、登录终端、登录 IP;
w:who 增强版,附带系统负载、用户空闲时间、正在执行的命令,运维排查服务器负载首选;
last:查看历史登录记录,排查异常登录、暴力破解溯源。
实操
# 当前登录用户[lizihan@centos7 ~15:18:32]$whoamilizihan# 查看所有在线用户[lizihan@centos7 ~15:19:02]$wholizihan pts/02026-07-2115:11(10.1.8.1)lizihan pts/12026-07-2115:11(10.1.8.1)# 在线用户+系统负载、空闲时间、执行命令[lizihan@centos7 ~15:19:05]$ w15:19:12 up6:38,3users, load average:0.00,0.01,0.05USERTTY FROM LOGIN@ IDLE JCPU PCPU WHAT lizihan pts/010.1.8.115:110.00s0.03s0.00s w lizihan pts/110.1.8.115:117:350.01s0.01s-bash# 系统历史登录记录,排查登录行为[lizihan@centos7 ~15:19:12]$ last lizihan pts/110.1.8.1 Tue Jul2115:11 still loggedinlizihan pts/010.1.8.1 Tue Jul2115:11 still loggedinlizihan pts/010.1.8.1 Tue Jul2111:41 -15:11(03:30)六、实战排错:杀不掉、自动重启的进程
本节核心重点
故障现象:kill 子进程后立刻重新生成,根源存在父进程持续拉起子进程;
标准排查流程:
① ps axf/ps jf 查看 PPID 父进程 ID
② 同时 kill 父进程 + 子进程,彻底清除
③ 兜底方案:删除程序二进制文件,阻止重新拉起;延伸:如果父进程是 systemd (PID=1),属于系统托管服务,不能直接 kill,要用 systemctl stop 停止。
模拟测试脚本(守护循环拉起高占用进程)
[laoma@centos7 ~]$mkdirbin[laoma@centos7 ~]$cat>bin/mm<<EOF #!/bin/bash while true do md5sum /dev/zero sleep 1 done EOF[laoma@centos7 ~]$chmod+x bin/mm[laoma@centos7 ~]$nohupmm&完整处理命令与思路
# 按CPU降序,找到高占用子进程PIDpsaxo pid,%cpu,command--sort-%cpu|head-n5# 查看父子进程关系,获取PPID父进程psax-f|grep-emd5sum-ePPID# 同时杀掉父进程、子进程,避免重新拉起kill父PID 子PID七、全文总结
ps 进程查看:
ps -ef查完整信息、ps axu查资源占用、ps axf查进程树;支持按用户 / 终端 / 进程名筛选,--sort 排序排查高负载;Shell 作业管理:
&后台、Ctrl+Z暂停、bg/fg切换;远程长时间任务用 nohup 或 screen 保活;交互程序无法后台运行;进程信号:优先使用
kill(15 优雅关闭),卡死进程再用kill -9;19 暂停、18 恢复;pgrep/pkill 批量操作,支持按用户 / 终端 / 父进程批量杀;用户登录排查:whoami/who/w/last 分层查看当前、在线、历史登录记录;
顽固进程排错:进程反复复活一定要追查 PPID 父进程,父子进程一同销毁才能彻底解决。