
1. 引言在 Linux 系统中进程管理是系统管理员和开发人员必须掌握的核心技能之一。无论是排查系统性能问题、管理后台任务还是理解程序的运行机制都离不开对进程的深入理解。本文将系统地介绍进程的基本概念、进程的查看方法以及作业控制等实用技巧帮助你从零开始掌握 Linux 进程管理。2. 核心概念程序、进程与线程在深入进程管理之前我们需要先厘清几个容易混淆的基础概念。软件从软件工程的角度来说软件不仅仅是一段代码它还包括授权、帮助文档等一整套完整的交付物。程序程序是可执行的文件它是静态的静静地存放在磁盘上尚未运行。进程进程是正在运行的程序它是动态的。一个进程在运行时需要占用系统资源包括CPU、内存、磁盘和网络等。线程线程是比进程更小的执行单元。一个进程可以包含多个线程它们共享进程的资源并发执行不同的任务。简单来说程序是菜谱进程是按照菜谱正在烹饪的菜肴而线程则是厨房里同时工作的多个厨师。3. 进程的组成与环境3.1 进程的组成部分一个进程在系统中是由以下部分组成的已分配内存的地址空间进程拥有自己独立的虚拟地址空间用于存放代码、数据和堆栈。安全属性包括进程的所有权凭据和特权决定了进程能访问哪些资源。程序代码的一个或多个执行线程进程的执行流至少包含一个主线程。进程状态如运行R、睡眠S、停止T等反映了进程当前的生命周期阶段。3.2 进程的环境进程的运行环境包括本地和全局变量进程内部定义的变量及其可访问的全局数据。当前调度上下文内核调度器用于恢复进程执行所需的寄存器状态等信息。分配的系统资源如文件描述符和网络端口等。3.3 进程的产生在 Linux 中新进程通常由父进程通过fork()系统调用复制自身而产生。例如当你在 bash 中执行sleep 5时bash 会先fork()出一个子进程然后子进程再通过exec()加载sleep程序。此时sleep进程就是 bash 进程的子进程。# 当前bash中执行sleep此时的sleep进程就是通过fork产生# sleep进程是bash进程的子进程[qfcentos7 ~]$sleep54. 查看进程状态查看进程是进程管理中最常用的操作主要使用ps命令。4.1 ps 命令选项分类ps命令的选项分为两类限定查看哪些进程用来选择进程。对选定的进程查看他们哪些属性决定输出哪些字段。同时ps命令支持三种版本的选项风格UNIX 风格使用单个-如ps -e。GNU 风格使用两个--如ps --sort。BSD 风格不使用-如ps aux。4.2 查看所有进程使用ps -e可以查看系统中所有进程但输出信息较为简洁[qfcentos7 ~]$ps-ePID TTY TIME CMD1? 00:00:02 systemd2? 00:00:00 kthreadd4? 00:00:00 kworker/0:0H6? 00:00:00 ksoftirqd/0......字段说明PID进程 ID。TTY进程所在的终端。TIME进程使用 CPU 的有效时间并不是程序的运行时间。CMD进程名称。4.3 查看进程详细信息使用ps -ef可以查看进程的完整信息包括父进程 ID 等[qfcentos7 ~]$ps-ef|head-n5UIDPIDPPIDC STIME TTY TIME CMD root10008:45 ? 00:00:02 /usr/lib/systemd/systemd --switched-root--system--deserialize22root20008:45 ? 00:00:00[kthreadd]root42008:45 ? 00:00:00[kworker/0:0H]root62008:45 ? 00:00:00[ksoftirqd/0]字段说明UID进程的执行者。PPID进程的父进程 ID。C进程消耗的 CPU 百分比。STIME进程开始执行的时刻。4.4 查看特定用户的进程使用ps -u 用户名 u可以查看指定用户运行的进程[qfcentos7 ~]$ps-uqf uUSERPID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND qf28100.00.2898449912? Ss10:160:00 /usr/lib/systemd/systemd--userqf28160.00.12354085332? S10:160:00(sd-pam)qf28310.00.2103895610400? Ssl10:160:00 /usr/bin/pulseaudio--daemonizeno --log-targetjournal4.5 查看特定终端的进程使用ps -t 终端号 u可以查看某个终端中运行的进程[qfcentos7 ~]$ps-tpts/1 uUSERPID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND qf28430.00.12264525396pts/1 Ss10:160:00-bashqf42330.00.02575083952pts/1 R10:400:00ps-tpts/1 u4.6 查看所有进程BSD 风格使用ps axu可以查看所有进程并显示 CPU 和内存占用率[qfcentos7 ~]$psaxuUSERPID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root10.00.318398414136? Ss 08:550:02 /usr/lib/systemd/systemd --switched-root--system--deserialize18root20.00.000? S 08:550:00[kthreadd]root30.00.000? I08:550:00[rcu_gp]root40.00.000? I08:550:00[rcu_par_gp]4.7 查看进程树使用ps axf可以以树状结构显示进程间的父子关系[qfcentos7 ~]$psaxf PID TTY STAT TIME COMMAND2? S0:00[kthreadd]3? I0:00\_[rcu_gp]......1159? Ss0:00 /usr/sbin/sshd-D-oCiphersaes256-gcmopenssh.com,chacha20-poly1305openssh.com2033? Ss0:00\_ sshd: root[priv]2064? S0:00|\_ sshd: rootpts/02075pts/0 Ss0:00|\_-bash2950pts/0 S0:00|\_manps2963pts/0 S0:00|\_less2800? Ss0:00\_ sshd: qf[priv]2833? S0:00\_ sshd: qfpts/12843pts/1 Ss0:00\_-bash4278pts/1 R0:00\_psaxf4.8 查看特定进程的特定属性使用-o选项可以自定义输出字段并通过 PID 或命令名限定进程# 通过PID限定[qfcentos7 ~]$ps-opid,%cpu,%mem,command1159PID %CPU %MEM COMMAND11590.00.1/usr/sbin/sshd-D-oCiphersaes256-gcmopenssh.com,chacha20-poly1305openssh.com...# 通过命令名称限定[qfcentos7 ~]$ps-Cpasswd-opid,ruser,euser,command PID RUSER EUSER COMMAND4420qf rootpasswd4.9 对进程进行排序使用--sort选项可以对输出结果排序%cpu表示升序-%cpu表示降序# 按CPU使用率降序排列[qfcentos7 ~]$psaxu--sort-%cpuUSERPID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root17860.45.11092936205568? Ssl 08:550:34 /usr/libexec/packagekitd qf33560.34.93042676197256tty2 Sl10:360:03 /usr/bin/gnome-shell root11500.10.861837232088? Ssl 08:550:12 /usr/libexec/platform-python-Es/usr/sbin/tuned-l-Pqf37280.12.71379632109476tty2 Sl10:360:01 /usr/bin/gnome-software --gapplication-service5. 作业控制前台进程与后台进程作业控制允许单个 shell 实例运行和管理多个命令。5.1 前台进程与后台进程前台进程一个终端中只有一个前台进程该进程可以从终端窗口中读取输入并响应键盘生成的信号。后台进程在后台运行的进程该进程不能从终端读取输入也不能接收键盘产生的中断。后台进程可能暂停也可能正在运行。如果正在运行的后台作业尝试从终端读取输入它将自动暂停。注意在ps列表中TTY 终端列显示为?号的进程肯定是后台进程但显示为其他终端的进程并不一定就是前台进程。5.2 后台启动进程任何一个进程都可以通过在命令末尾增加符号在后台启动。bash 会显示作业号Job Number和进程的 PID并且 shell 不需要等待子进程运行结束可以继续运行其他命令。首先我们准备一个测试脚本# 准备脚本[rootcentos7 ~]# cat EOF /usr/local/bin/study#!/bin/bashwhiletruedoecho$(date): Im studying [$]study.logsleep1doneEOF[rootcentos7 ~]# chmod x /usr/local/bin/study然后在后台启动该脚本[qfcentos7 ~]$ study Linux[1]67307[qfcentos7 ~]$jobs[1] 运行中其中[1]是作业号67307是进程的 PID。使用jobs命令可以查看当前 shell 中的作业列表。6. 总结本文系统地介绍了 Linux 进程管理的核心知识基础概念程序是静态的文件进程是运行中的程序线程是更小的执行单元。进程组成进程由地址空间、安全属性、执行线程和进程状态组成。进程查看ps命令支持多种选项风格可以按用户、终端、PID 等维度筛选进程并自定义输出字段和排序方式。作业控制通过符号可以将进程放入后台运行使用jobs命令管理作业。掌握这些命令和概念是进一步学习 Linux 系统性能调优、故障排查和自动化运维的基础。建议读者在虚拟机中多加练习熟悉各种ps选项的组合使用。