Linux进程管理全解:进程查看、后台任务、信号控制实战教程

📅 2026/7/22 7:06:42 👁️ 阅读次数 📝 编程学习
Linux进程管理全解:进程查看、后台任务、信号控制实战教程

前言

Linux 系统中所有程序运行都依托进程,服务器运维、程序调试、服务器故障排查都离不开进程管理。很多新手只会简单使用pskill,一旦遇到远程后台任务中断、进程杀不掉、占用 CPU 等高负载场景就束手无策。
本文附上带真实操作时间的命令,兼顾理论 + 实操,适合运维入门、面试复习。

一、基础概念:分清程序、软件、进程、线程

本节核心重点

  1. 静态 vs 动态:程序是磁盘静态文件,进程是运行中的动态实例,核心区分点;

  2. fork 创建机制:Linux 所有进程都是父进程 fork 生成,bash 是绝大多数用户命令的父进程;

  3. 操作系统四大职能:进程调度(任务管理)是运维核心,其余三块作为底层基础;

  4. 进程自带独立资源空间,线程共享进程资源,多线程更轻量化。

概念详解

  1. 程序:磁盘上静态、未运行的可执行文件,不占用 CPU、内存资源。

  2. 软件:完整套装,包含程序、配置文件、帮助手册、依赖包,如 httpd、nginx。

  3. 进程:程序加载运行后的实例,会占用 CPU、内存、磁盘 IO、网络端口,是操作系统资源调度最小单位。

  4. 线程:进程内部轻量执行单元,同一进程内线程共享内存空间。

进程组成(必记字段)

独立内存地址空间、运行权限凭据、多条执行线程、运行状态。

进程运行环境

局部 / 全局变量、CPU 调度上下文、打开的文件、占用端口。

fork 机制

终端执行任意命令,当前 bash 父进程调用 fork 生成子进程,示例:

[lizihan@centos7 ~11:41:09]$sleep5

sleep 是 bash 的子进程。

操作系统四大核心职责

  1. 任务管理:进程 / 线程调度(本文核心)

  2. 设备管理:网卡、硬盘、显示器硬件驱动

  3. 文件系统:文件存储、权限、目录管理

  4. 内存管理:内存分配、回收、Swap 交换分区

二、进程查看:ps 命令全场景实操

本节核心重点

  1. ps 三种参数风格:UNIX (-)、GNU (--)、BSD (无横杠),日常混用无冲突;

  2. 高频命令区分:ps -ef看完整信息、ps axu看资源占用、ps axf看父子进程树;

  3. 关键字段释义(面试必考):PID 进程 ID、PPID 父进程 ID、% CPU/% MEM 资源占用、TTY 终端;

  4. 筛选用法:按用户、终端、进程名过滤,支持自定义输出字段、按 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 u

ps axu:BSD 风格,完整资源信息

重点:自带 % CPU、% MEM,排查服务器高负载第一命令

[lizihan@centos7 ~11:41:09]$psaxu

ps -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 COMMAND9177Ssleep60

3. 树形展示父子进程 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\_sleep1232

4. 自定义字段 + 进程排序

重点

--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 作业控制:前台 / 后台进程管理

本节核心重点

  1. 前台进程:独占终端,接收Ctrl+C/Ctrl+Z;后台进程不占用终端,但交互程序无法后台运行

  2. 核心快捷键 / 命令:&后台启动、Ctrl+Z暂停、bg %任务号后台运行、fg %任务号切前台;

  3. jobs 只查看当前终端任务,跨终端看不到;

  4. 远程长时间任务痛点:关闭 SSH 终端会发送 SIGHUP 杀死进程,两种解决方案nohupscreen

  5. 面试考点: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]5950

3. 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 实战

本节核心重点

  1. 信号是发给进程的软中断,用于暂停、唤醒、终止进程;

  2. 5 个高频信号(必背):

    • 2 SIGINT:Ctrl+C 优雅终止前台

    • 9 SIGKILL:强制杀死,进程无法捕获 / 忽略,万不得已再用

    • 15 SIGTERM:kill 默认信号,优雅关闭,推荐优先使用

    • 18 SIGCONT:唤醒暂停进程

    • 19 SIGSTOP:暂停进程运行

  3. kill 两种用法:kill %任务号操作当前终端 jobs、kill PID操作全局进程;

  4. pgrep 批量匹配进程 PID,pkill 批量发信号,支持按进程名、用户、终端、父进程批量杀;

  5. 批量清理卡死进程思路: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)SIGTSTP

2. 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 MySQL

3. 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

本节核心重点

  1. whoami:最简单,查看当前执行命令的用户;

  2. who:查看所有在线登录用户、登录终端、登录 IP;

  3. w:who 增强版,附带系统负载、用户空闲时间、正在执行的命令,运维排查服务器负载首选;

  4. 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)

六、实战排错:杀不掉、自动重启的进程

本节核心重点

  1. 故障现象:kill 子进程后立刻重新生成,根源存在父进程持续拉起子进程

  2. 标准排查流程:
    ① ps axf/ps jf 查看 PPID 父进程 ID
    ② 同时 kill 父进程 + 子进程,彻底清除
    ③ 兜底方案:删除程序二进制文件,阻止重新拉起;

  3. 延伸:如果父进程是 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

七、全文总结

  1. ps 进程查看ps -ef查完整信息、ps axu查资源占用、ps axf查进程树;支持按用户 / 终端 / 进程名筛选,--sort 排序排查高负载;

  2. Shell 作业管理&后台、Ctrl+Z暂停、bg/fg切换;远程长时间任务用 nohup 或 screen 保活;交互程序无法后台运行;

  3. 进程信号:优先使用kill(15 优雅关闭),卡死进程再用kill -9;19 暂停、18 恢复;pgrep/pkill 批量操作,支持按用户 / 终端 / 父进程批量杀;

  4. 用户登录排查:whoami/who/w/last 分层查看当前、在线、历史登录记录;

  5. 顽固进程排错:进程反复复活一定要追查 PPID 父进程,父子进程一同销毁才能彻底解决。