一、Linux程序与进程


1、程序,进程,线程的概念

  • 程序:是一组指令及参数的集合,按照既定的逻辑控制计算机运行用来完成特定任务,是静态的;

  • 进程:是运行着的程序,是操作系统执行的基本单位,是程序运行的过程, 是动态的,是有生命周期及运行状态的。是操作系统分配内存、CPU时间片等资源的基本单位。

  • 线程:是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

2、程序和进程的区别

  • 程序是静态的,它只是一组指令的集合,不具有任何的运行意义。而进程是程序运行的动态过程;

  • 进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程;

  • 进程还具有并发性和交往性,而程序却是封闭的。

3、进程和线程的区别

  • 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发拥有多个线程,而一个线程同时只能被一个进程所拥有;

  • 线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口,它必须组成进程才能被执行。

二、Linux进程基础(生命周期)

1、进程生命周期

  • 父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID(PID),PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程。

  • 所有进程都是第一个系统进程的后代:在centos6中,第一个系统进程是init,而在centos7中,第一个系统进程是systemd。

2、父子进程的关系

  • 子进程由父进程产生,在linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。

  • 运行过程:子进程运行时父进程休眠。当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境后,剩余释放不掉的资源称之为僵尸进程。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。

  • 进程查看命令

1、pstree

用于查看进程树之间的关系,谁是父进程,谁是子进程,可以清楚的看出来是谁创建了谁

下面是一个激活父子进程树状图的命令,有些系统可能没有自动激活该进程。

yum install -y psmisc

用法:

pstree [选项]  

选项:

-A 各进程树之间的连接以ASCII码字符来连接
-U :各进程树之间的连接以utf8字符来连接,某些终端可能会有错误
-p 同时列出每个进程的PID
-u 同时列出每个进程的所属账号名称
[root@localhost nginx-1.29.1]# pstree
systemd─┬─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─VGAuthService
        ├─auditd───{auditd}
        ├─chronyd
        ├─crond
        ├─dbus-daemon
        ├─irqbalance
        ├─login───bash
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─nginx───nginx
        ├─polkitd───6*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd─┬─bash───pstree
        │             └─bash───top
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vmtoolsd───2*[{vmtoolsd}]

2、ps

显示系统当前进程瞬间运行状态

用法:

ps [选项]  

选项:

-A 所有的进程均显示出来,与 -e 具有同样的效用
-a 显示现行终端机下的所有进程,包括其他用户的进程
-u 以用户为主的进程状态
-x 通常与 a 这个参数一起使用,可列出较完整信息
-l 较长、较详细的将该PID 的的信息列出
[root@localhost ~]# ps -A
   PID TTY          TIME CMD
     1 ?        00:00:01 systemd
     2 ?        00:00:00 kthreadd
     4 ?        00:00:00 kworker/0:0H
     6 ?        00:00:00 ksoftirqd/0
     7 ?        00:00:00 migration/0
     8 ?        00:00:00 rcu_bh
     9 ?        00:00:00 rcu_sched
    10 ?        00:00:00 lru-add-drain

查看nginx程序的进程

[root@localhost conf]# ps aux | grep [n]ginx
root       8484  0.0  0.0  20596   612 ?        Ss   19:10   0:00 nginx: master process nginx
nobody     8485  0.0  0.0  21040  1312 ?        S    19:10   0:00 nginx: worker process

进程状态:

S:休眠

s:父进程

R:运行

Z:僵尸进程(前台程序已死,但后台驻留进程没有正常退出;后果就是占用资源不干活。)

在Linux中,使用 ps aux 命令可以查看当前运行的进程及其详细信息。输出的每一列代表不同的信息,其中 STAT(或 S)列表示进程的状态(Process State),即进程的类型或当前行为。

ps aux 输出的进程状态(STAT)详解


ps aux 的典型输出如下:

[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.1  0.1 190932  3940 ?        Ss   18:06   0:01 /usr
root          2  0.0  0.0      0     0 ?        S    18:06   0:00 [kth
root          4  0.0  0.0      0     0 ?        S<   18:06   0:00 [kwo
root        549  0.0  0.0      0     0 ?        S    18:07   0:00 [kwo
root        602  0.0  0.1  39056  2876 ?        Ss   18:07   0:00 /usr
root        625  0.0  0.1 190376  3416 ?        Ss   18:07   0:00 /usr
root        634  0.0  0.0      0     0 ?        S    18:07   0:00 [kwo
root        636  0.1  0.0  45456  1916 ?        Ss   18:07   0:01 /usr
root        779  0.0  0.0  55532   856 ?        S<sl 18:07   0:00 /sbi
dbus        802  0.0  0.1  58216  2492 ?        Ss   18:07   0:00 /usr
root        804  0.0  0.5 626428 11260 ?        Ssl  18:07   0:00 /usr
root        805  0.0  0.2 168304  5180 ?        Ss   18:07   0:00 /usr
root        806  0.1  0.2 273164  4872 ?        Ssl  18:07   0:01 /usr
root        808  0.0  0.0  26424  1788 ?        Ss   18:07   0:00 /usr
polkitd     809  0.0  0.6 612332 12276 ?        Ssl  18:07   0:00 /usr
root        810  0.0  0.0  21688  1332 ?        Ss   18:07   0:00 /usr
root        825  0.0  0.0 126388  1632 ?        Ss   18:07   0:00 /usr
chrony      831  0.0  0.0 117808  1736 ?        S    18:07   0:00 /usr
root        845  0.0  0.1  99288  2800 ?        Ss   18:07   0:00 logi
root        908  0.0  0.2 102904  5504 ?        S    18:07   0:00 /sbi
root       1115  0.0  0.9 574280 19472 ?        Ssl  18:07   0:00 /usr
root       1117  0.0  0.2 218528  4204 ?        Ssl  18:07   0:00 /usr
root       1233  0.0  0.1  89708  2128 ?        Ss   18:07   0:00 /usr
postfix    1238  0.0  0.2  89812  4088 ?        S    18:07   0:00 pick
postfix    1239  0.0  0.2  89880  4104 ?        S    18:07   0:00 qmgr
root       1367  0.0  0.0      0     0 ?        S<   18:07   0:00 [kwo
root       1371  0.0  0.1 115540  2092 tty1     Ss+  18:07   0:00 -bas
root       1388  0.0  0.0      0     0 ?        S<   18:07   0:00 [kwo
root       1401  0.0  0.2 112900  4312 ?        Ss   18:09   0:00 /usr
root       1408  0.0  0.3 159376  6244 ?        Ds   18:11   0:00 sshd
root       1410  0.0  0.1 115544  2048 pts/0    Ss   18:11   0:00 -bas
root       1714  0.0  0.0      0     0 ?        S    18:17   0:00 [kwo
root       2007  0.0  0.0      0     0 ?        R    18:22   0:00 [kwo
root       2250  0.0  0.0 155448  1876 pts/0    R+   18:27   0:00 ps a

输出解析:

  • USER:进程的所有者。

  • PID:进程的 ID。

  • %CPU:进程占用的 CPU 百分比。

  • %MEM:进程占用的内存百分比。

  • VSZ:进程使用的虚拟内存大小。

  • RSS:进程使用的物理内存大小。

  • TTY:进程所在的终端。

  • STAT:进程的状态,如S(休眠)、R(运行)、Z(僵尸进程)等。

  • START:进程的启动时间。

  • TIME:进程启动耗时时间。

  • COMMAND:启动进程的命令。

其中 STAT 的字母组合表示进程的状态,常见的有:

状态码 含义 说明
R Running (运行中) 进程正在运行或可运行(在运行队列中)。
S Interruptible Sleep (可中断睡眠) 进程在等待事件(如I/O、信号),可被信号唤醒。
D Uninterruptible Sleep (不可中断睡眠) 进程在等待硬件I/O(如磁盘读写),不能被信号唤醒,通常与内核相关。
T Stopped (已停止) 进程被信号(如 SIGSTOP)暂停,或正在被调试(gdb)。
Z Zombie (僵尸进程) 进程已终止,但父进程尚未调用 wait() 回收资源。
`X`` Dead (已死亡) 进程已完全终止(极少见到)。
I Idle (空闲) 内核线程,处于空闲状态(较新内核使用)。
< High Priority (高优先级) 进程优先级较高(nice 值为负)。
N Low Priority (低优先级) 进程优先级较低(nice 值为正)。
s Session Leader (会话领导者) 进程是会话(Session)的首进程(如 bash)。
l Multi-threaded (多线程) 进程是多线程的(如 nginx)。
+ Foreground (前台进程) 进程属于前台进程组(如终端运行的命令)。

常见进程状态组合

  • Ss:会话领导者(s),处于可中断睡眠(S),如 bash 终端进程。

  • Ssl:多线程(l)的会话领导者(s),如 systemd

  • R+:前台运行(+)的进程(R),如 top 命令。

  • D:不可中断睡眠(D),常见于磁盘I/O密集型任务(如 dd 命令)。

  • Z:僵尸进程(Z),需要父进程回收资源。

  • I<:内核空闲线程(I),低优先级(<)。

ps -efj  显示进程父子关系

[root@localhost ~]# ps -efj
UID         PID   PPID   PGID    SID  C STIME TTY          TIME CMD
root          1      0      1      1  0 18:06 ?        00:00:01 /usr/lib/sys
root          2      0      0      0  0 18:06 ?        00:00:00 [kthreadd]
root          4      2      0      0  0 18:06 ?        00:00:00 [kworker/0:0
root          6      2      0      0  0 18:06 ?        00:00:00 [ksoftirqd/0
root          7      2      0      0  0 18:06 ?        00:00:00 [migration/0
root          8      2      0      0  0 18:06 ?        00:00:00 [rcu_bh]
root          9      2      0      0  0 18:06 ?        00:00:01 [rcu_sched]
root         10      2      0      0  0 18:06 ?        00:00:00 [lru-add-dra

top  动态查看进程状态

[root@localhost ~]# top
top - 19:45:16 up  1:38,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 195 total,   1 running, 194 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0
KiB Mem :  2027892 total,  1416536 free,   211264 used,   400092 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1657380 avail Mem

ps -elf 命令详解

基本语法

ps -elf
  • -e:显示所有进程(等同于 -A)。

  • -l:长格式输出,显示更多字段(如 FSPRINI)。

  • -f:完整格式输出,显示完整的命令行(CMD)和用户信息。


ps -elf 输出字段解析

执行 ps -elf 后,输出类似如下格式:

[root@localhost ~]# ps -elf
F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root          1      0  0  80   0 - 47733 ep_pol 18:06 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
1 S root          2      0  0  80   0 -     0 kthrea 18:06 ?        00:00:00 [kthreadd]
1 S root          4      2  0  60 -20 -     0 worker 18:06 ?        00:00:00 [kworker/0:0H]
1 S root          6      2  0  80   0 -     0 smpboo 18:06 ?        00:00:00 [ksoftirqd/0]
1 S root          7      2  0 -40   - -     0 smpboo 18:06 ?        00:00:00 [migration/0]
1 S root          8      2  0  80   0 -     0 rcu_gp 18:06 ?        00:00:00 [rcu_bh]
1 S root          9      2  0  80   0 -     0 rcu_gp 18:06 ?        00:00:01 [rcu_sched]
1 S root         10      2  0  60 -20 -     0 rescue 18:06 ?        00:00:00 [lru-add-drain]
5 S root         11      2  0 -40   - -     0 smpboo 18:06 ?        00:00:00 [watchdog/0]

各列含义如下:

字段 含义 详细说明
F 进程标志(Flags) 表示进程的权限和状态(十六进制数字),通常由内核使用,普通用户无需关注。
S 进程状态(STAT) 进程的当前状态(同 ps auxSTAT 列),如 R(运行)、S(睡眠)、Z(僵尸)等。
UID 用户ID 进程所有者的用户ID(如 rootwww-data)。
PID 进程ID 进程的唯一标识符。
PPID 父进程ID 创建该进程的父进程ID(如 initPPID0)。
C CPU占用率 进程最近使用的CPU百分比(类似 top 中的 %CPU)。
PRI 优先级(Priority) 进程的调度优先级(数值越小优先级越高)。
NI Nice值 用户可调整的优先级修正值(范围 -2019,默认 0)。
ADDR 内存地址 进程的内存地址(通常为 -,表示无意义)。
SZ 虚拟内存大小(KB) 进程占用的虚拟内存大小(VSZ)。
WCHAN 等待事件 进程正在等待的内核事件(如 pollfutex),- 表示运行中。
STIME 启动时间 进程的启动日期或时间(如 May30)。
TTY 控制终端 进程关联的终端(? 表示无终端,如守护进程)。
TIME CPU时间 进程累计使用的CPU时间(格式 HH:MM:SS)。
CMD 命令行 进程的完整命令行(-f 选项显示完整路径和参数)。

关键字段详解


1. 进程状态(S 列)

ps auxSTAT 列相同,常见状态包括:

  • R:运行中(Running)。

  • S:可中断睡眠(Interruptible Sleep,等待事件)。

  • D:不可中断睡眠(Uninterruptible Sleep,通常与磁盘I/O相关)。

  • Z:僵尸进程(Zombie)。

  • T:已停止(Stopped,如被 SIGSTOP 暂停)。

  • I:空闲(Idle,内核线程)。

2. 优先级(PRINI

  • PRI:进程的实际优先级(由内核动态调整,数值越小优先级越高)。

  • NI:Nice值(用户可调整的优先级修正值):

    • -20:最高优先级(抢占更多CPU)。

    • 19:最低优先级(CPU友好,适合后台任务)。

3. WCHAN

  • 显示进程当前等待的内核事件(如 pollfutex)。

  • 若为 -,表示进程正在运行或无需等待。

4. CMD

  • -f 选项会显示完整命令行(包括参数),而 ps aux 默认截断长命令。

ps -elf vs ps aux

对比项 ps -elf ps aux
显示格式 长格式 + 完整命令行 简洁格式(部分截断命令行)
关键字段 F, PRI, NI, WCHAN %CPU, %MEM, STAT
适用场景 查看进程优先级、父子关系、内核事件 快速查看CPU/内存占用和进程状态
STAT 列 S(同 ps auxSTAT STAT

3、pgrep

选项:

-l 同时显示进程名和PID
-o 当匹配多个同一命令启动的进程时,显示进程号最小的那个
-n 当匹配多个同一命令启动的进程时,显示进程号最大的那个
[root@localhost ~]# pgrep -l nginx
8484 nginx
8485 nginx

4、top、htop

top:动态监控系统处理器状态,htop姑且称之为top的增强版

常用选项

  • -d:指定更新的间隔时间,以秒为单位。

  • -n:指定更新的次数。

  • -p:监控指定进程的 ID。

  • -u:监控指定用户的进程。

[root@localhost ~]# top -d 1 -n 1 | grep "%Cpu" | cut -d',' -f3 | tr -s ' ' | cut -d' ' -f2
0.0

常用按键

  • 空格键:立即刷新显示。

  • M:按照内存使用百分比对进程进行排序。

  • P:按照 CPU 使用百分比对进程进行排序。

  • T:按照进程运行时间对进程进行排序。

  • q:退出 top 命令。

  • h:显示帮助信息。

案例

`top -d 5`:每隔 5 秒更新一次进程信息。

`top -n 2`:更新两次进程信息后退出。

`top -p 1234`:监控进程 ID 为 1234 的进程。

`top -u root`:监控 root 用户的进程。

二、进程管理命令


1、kill

选项:

-l 列出所有信号参数
-a 当处理当前进程时,不限制命令名和进程号的对应关系
-u 指定用户
-p 指定kill 命令只打印相关进程的进程号,而不发送任何信号
-s 发送指定的信号
-9 强制杀死
-0(数字零) 用来检测一个进程是否存在。

2、pkill与killall

pkill是ps命令和kill命令的结合,按照进程名来杀死指定进程,pkill和killall应用方法差不多,也是直接杀死运行中的程序,如果想杀掉单个进程,请用kill来杀掉。

三、进程类型(前台类型驻留在右前端,后台类型驻留在右后端)


1、前台进程

在终端界面运行的进程,运行前台进程后,终端无法操作

2、后台进程

驻留在后端运行的进程

Logo

惟楚有才,于斯为盛。欢迎来到长沙!!! 茶颜悦色、臭豆腐、CSDN和你一个都不能少~

更多推荐