目录
一、Linux程序与进程
1、程序,进程,线程的概念
程序:是一组指令及参数的集合,按照既定的逻辑控制计算机运行用来完成特定任务,是静态的;
进程:是运行着的程序,是操作系统执行的基本单位,是程序运行的过程, 是动态的,是有生命周期及运行状态的。是操作系统分配内存、CPU时间片等资源的基本单位。
线程:是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
2、程序和进程的区别
程序是静态的,它只是一组指令的集合,不具有任何的运行意义。而进程是程序运行的动态过程;
进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程;
进程还具有并发性和交往性,而程序却是封闭的。
3、进程和线程的区别
一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发拥有多个线程,而一个线程同时只能被一个进程所拥有;
线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口,它必须组成进程才能被执行。
二、Linux进程基础(生命周期)
1、进程生命周期
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID(PID),PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程。
所有进程都是第一个系统进程的后代:在centos6中,第一个系统进程是init,而在centos7中,第一个系统进程是systemd。
2、父子进程的关系
子进程由父进程产生,在linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段(内存结构)以及父进程的进程环境。子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。
运行过程:子进程运行时父进程休眠。当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境后,剩余释放不掉的资源称之为僵尸进程。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。
三、进程查看命令
1、pstree
用于查看进程树之间的关系,谁是父进程,谁是子进程,可以清楚的看出来是谁创建了谁
选项:
-A 各进程树之间的连接以ASCII码字符来连接
-p 同时列出每个进程的PID
[root@localhost ~]# pstree -A
systemd-+-NetworkManager-+-dhclient
| `-3*[{NetworkManager}]
|-anacron
|-atd
|-auditd---{auditd}
|-chronyd
|-crond
|-dbus-daemon
|-firewalld---{firewalld}
|-irqbalance---{irqbalance}
|-login---bash
|-lsmd
|-polkitd---3*[{polkitd}]
|-restorecond
|-rngd---3*[{rngd}]
|-rpcbind
|-rsyslogd---2*[{rsyslogd}]
|-sshd---sshd---sshd---bash---pstree
|-systemd-journal
|-systemd-logind
|-systemd-udevd
`-tuned---3*[{tuned}]
[root@localhost ~]# pstree -p
systemd(1)─┬─NetworkManager(1101)─┬─dhclient(1313)
│ ├─{NetworkManager}(1110)
│ ├─{NetworkManager}(1111)
│ └─{NetworkManager}(1112)
├─anacron(2921)
├─atd(1169)
├─auditd(1030)───{auditd}(1031)
├─chronyd(1076)
├─crond(1171)
├─dbus-daemon(1051)
├─firewalld(1077)───{firewalld}(1289)
├─irqbalance(1062)───{irqbalance}(1068)
├─login(1827)───bash(1835)
├─lsmd(1056)
├─polkitd(1225)─┬─{polkitd}(1272)
│ ├─{polkitd}(1273)
│ └─{polkitd}(1274)
├─restorecond(1073)
├─rngd(1059)─┬─{rngd}(1090)
│ ├─{rngd}(1591)
│ └─{rngd}(1593)
├─rpcbind(1029)
├─rsyslogd(1497)─┬─{rsyslogd}(1517)
│ └─{rsyslogd}(1519)
├─sshd(1129)───sshd(1908)───sshd(1912)───bash(1913)───pstree(3466)
├─systemd-journal(832)
├─systemd-logind(1061)
├─systemd-udevd(887)
└─tuned(1141)─┬─{tuned}(1475)
├─{tuned}(1476)
└─{tuned}(1477)
2、ps
显示系统当前进程瞬间运行状态
选项:
-A | 所有的进程均显示出来,与 -e 具有同样的效用 |
-a | 显示现行终端机下的所有进程,包括其他用户的进程 |
-u | 以用户为主的进程状态 |
-x | 通常与 a 这个参数一起使用,可列出较完整信息 |
-l | 较长、较详细的将该 PID 的信息列出 |
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 1.1 72312 39756 ? Ss 13:49 0:05 /usr/lib/systemd/systemd --swi
root 2 0.0 0.0 0 0 ? S 13:49 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 13:49 0:00 [pool_workqueue_release]
root 4 0.0 0.0 0 0 ? I< 13:49 0:00 [kworker/R-rcu_g]
root 5 0.0 0.0 0 0 ? I< 13:49 0:00 [kworker/R-rcu_p]
root 6 0.0 0.0 0 0 ? I< 13:49 0:00 [kworker/R-slub_]
root 7 0.0 0.0 0 0 ? I< 13:49 0:00 [kworker/R-netns]
root 9 0.0 0.0 0 0 ? I< 13:49 0:00 [kworker/0:0H-events_highpri]
root 11 0.0 0.0 0 0 ? I 13:49 0:00 [kworker/u256:0-ext4-rsv-conve
输出解析:
USER
:进程的所有者。
PID
:进程的 ID。
%CPU
:进程占用的 CPU 百分比。
%MEM
:进程占用的内存百分比。
VSZ
:进程使用的虚拟内存大小。
RSS
:进程使用的物理内存大小。
TTY
:进程所在的终端。
STAT
:进程的状态,如S
(休眠)、R
(运行)、Z
(僵尸进程)等。
START
:进程的启动时间。
TIME
:进程启动耗时时间。
COMMAND
:启动进程的命令。
进程状态:
S:休眠
s:父进程
R:运行
Z:僵尸进程(前台程序已死,但后台驻留进程没有正常退出;后果就是占用资源不干活。)
在Linux中,使用
ps aux
命令可以查看当前运行的进程及其详细信息。输出的每一列代表不同的信息,其中 STAT(或S
)列表示进程的状态(Process State),即进程的类型或当前行为。
ps aux
输出的进程状态(STAT)详解
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 1.1 72312 39756 ? Ss 13:49 0:05 /usr/lib/systemd/systemd --swi
root 2 0.0 0.0 0 0 ? S 13:49 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 13:49 0:00 [pool_workqueue_release]
root 4 0.0 0.0 0 0 ? I< 13:49 0:00 [kworker/R-rcu_g]
其中 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),低优先级(<) 无明确特定示例 查看进程状态
(1)、ps aux
(显示所有进程):
[root@localhost ~]# ps aux | grep nginx
root 2014 0.0 0.0 4300 1568 ? Ss 16:26 0:00 nginx: master process /usr/local/nginx129/sbin/nginx
nobody 2015 0.0 0.1 6028 3480 ? S 16:26 0:00 nginx: worker process
root 2019 0.0 0.2 21988 8052 pts/0 S+ 16:26 0:00 grep --color=auto nginx
(2)、ps -efj
(显示进程父子关系):
[root@localhost ~]# ps -efj
UID PID PPID PGID SID C STIME TTY TIME CMD
root 1 0 1 1 0 16:10 ? 00:00:02 /usr/lib/systemd/systemd --sw
root 2 0 0 0 0 16:10 ? 00:00:00 [kthreadd]
root 3 2 0 0 0 16:10 ? 00:00:00 [pool_workqueue_release]
可查看 PPID
(父进程ID)和 STAT
状态。
(3)、top
/ htop
(动态查看进程状态):
[root@localhost ~]# top
top - 16:37:25 up 27 min, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 229 total, 1 running, 228 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.1 hi, 0.0 si, 0.0 st
MiB Mem : 3372.8 total, 2760.2 free, 558.4 used, 277.8 buff/cache
MiB Swap: 4016.0 total, 4016.0 free, 0.0 used. 2814.3 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2000 root 20 0 0 0 0 I 0.3 0.0 0:00.05 kworker/u257:0-events_un+
1 root 20 0 72028 34620 10208 S 0.0 1.0 0:02.02 systemd
在 top
中,S
列同样表示进程状态。
ps -elf
命令详解
ps -elf
是 Linux 中查看进程信息的常用命令之一,它以长格式(-l
)和完整格式(-f
)显示所有进程(-e
),并提供更详细的进程状态信息。
语法:
-e
:显示所有进程(等同于-A
)。
-l
:长格式输出,显示更多字段(如F
、S
、PRI
、NI
)。
-f
:完整格式输出,显示完整的命令行(CMD
)和用户信息。
[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 - 18007 ep_pol 16:10 ? 00:00:02 /usr/lib/systemd/s
1 S root 2 0 0 80 0 - 0 kthrea 16:10 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 kthrea 16:10 ? 00:00:00 [pool_workqueue_re
1 I root 4 2 0 60 -20 - 0 rescue 16:10 ? 00:00:00 [kworker/R-rcu_g]
输出解析:
字段 | 含义 | 详细说明 |
---|---|---|
F | 进程标志(Flags) | 表示进程的权限和状态(十六进制数字),通常由内核使用,普通用户无需关注。 |
S | 进程状态(STAT) | 进程的当前状态(同 ps aux 的 STAT 列),如 R(运行)、S(睡眠)、Z(僵尸)等。 |
UID | 用户 ID | 进程所有者的用户 ID(如 root、www - data)。 |
PID | 进程 ID | 进程的唯一标识符。 |
PPID | 父进程 ID | 创建该进程的父进程 ID(如 init 的 PPID 是 0)。 |
C | CPU 占用率 | 进程最近使用的 CPU 百分比(类似 top 中的 %CPU)。 |
PRI | 优先级(Priority) | 进程的调度优先级(数值越小优先级越高)。 |
NI | Nice 值 | 用户可调整的优先级修正值(范围 -20 到 19,默认 0)。 |
ADDR | 内存地址 | 进程的内存地址(通常为 -,表示无意义)。 |
SZ | 虚拟内存大小(KB) | 进程占用的虚拟内存大小(VSZ)。 |
WCHAN | 等待事件 | 进程正在等待的内核事件(如 poll、futex), - 表示运行中。 |
STIME | 启动时间 | 进程的启动日期或时间(如 May30)。 |
TTY | 控制终端 | 进程关联的终端(? 表示无终端,如守护进程)。 |
TIME | CPU 时间 | 进程累计使用的 CPU 时间(格式 HH:MM:SS)。 |
CMD | 命令行 | 进程的完整命令行(-f 选项显示完整路径和参数)。 |
关键字段详解:
(1)、进程状态(S
列)
与 ps aux
的 STAT
列相同,常见状态包括:
R
:运行中(Running)。
S
:可中断睡眠(Interruptible Sleep,等待事件)。
D
:不可中断睡眠(Uninterruptible Sleep,通常与磁盘I/O相关)。
Z
:僵尸进程(Zombie)。
T
:已停止(Stopped,如被SIGSTOP
暂停)。
I
:空闲(Idle,内核线程)。
(2)、优先级(PRI
和 NI
)
PRI
:进程的实际优先级(由内核动态调整,数值越小优先级越高)。
NI
:Nice值(用户可调整的优先级修正值):
-20
:最高优先级(抢占更多CPU)。
19
:最低优先级(CPU友好,适合后台任务)。
(3)、 WCHAN
列
显示进程当前等待的内核事件(如
poll
、futex
)。若为
-
,表示进程正在运行或无需等待。
(4)、CMD
列
-f
选项会显示完整命令行(包括参数),而ps aux
默认截断长命令。
ps -elf
与ps aux的区别
对比项 | ps -elf | ps aux |
---|---|---|
显示格式 | 长格式 + 完整命令行 | 简洁格式(部分截断命令行) |
关键字段 | F, PRI, NI, WCHAN | %CPU, %MEM, STAT |
适用场景 | 查看进程优先级、父子关系、内核事件 | 快速查看CPU/内存占用和进程状态 |
STAT列 | S(同ps aux的STAT) | STAT |
常用组合命令
(1)、查找特定进程
ps -elf | grep nginx
[root@localhost ~]# ps -elf | grep nginx
1 S root 2014 1 0 80 0 - 1075 sigsus 16:26 ? 00:00:00 nginx: master process /usr/local/nginx129/sbin/nginx
5 S nobody 2015 2014 0 80 0 - 1507 ep_pol 16:26 ? 00:00:00 nginx: worker process
0 S root 2085 1825 0 80 0 - 5497 pipe_r 16:54 pts/0 00:00:00 grep --color=auto nginx
(2)、查看进程树(父子关系)
ps -elf --forest
[root@localhost ~]# ps -elf --forest
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
1 S root 2 0 0 80 0 - 0 kthrea 16:10 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 kthrea 16:10 ? 00:00:00 \_ [pool_workqueue_release]
1 I root 4 2 0 60 -20 - 0 rescue 16:10 ? 00:00:00 \_ [kworker/R-rcu_g]
1 I root 5 2 0 60 -20 - 0 rescue 16:10 ? 00:00:00 \_ [kworker/R-rcu_p]
(3)、按CPU或内存排序
ps -elf --sort=-%cpu # 按CPU降序
ps -elf --sort=-%mem # 按内存降序
(4)、查看僵尸进程
ps -elf | grep 'Z'
3、pgrep
查看进程的信息,包括进程是否已经消亡,通过pgrep来获得正在被调度的进程的相关信息。 pgrep通过匹配其程序名,找到匹配的进程
选项:
-l | 同时显示进程名和PID |
---|
**注意:#pgrep命令用来查找进程的信息,通常会和kill命令来连用,在指定条件下kill问题进程**
pgrep [选项] pidname #先查找进程号
kill [选项] pid #用kill 结束进程
4、top、htop
top:动态监控系统处理器状态
选项:
-d | 指定更新的间隔时间,以秒为单位。 |
-n | 指定更新的次数。 |
-p | 监控指定进程的 ID。 |
-u | 监控指定用户的进程。 |
常用按键:
空格键 | 立即刷新显示 |
M | 按照内存使用百分比对进程进行排序。 |
P | 按照 CPU 使用百分比对进程进行排序。 |
T | 按照进程运行时间对进程进行排序。 |
q | 退出 top 命令。 |
h | 显示帮助信息。 |
二、进程管理命令
1、kill
语法:kill [选项] pid
选项:
-l | 列出所有信号参数 |
-s | 发送指定的信号 |
-9 | 强制杀死 |
-0 | 用来检测一个进程是否存在。 |
[root@localhost ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
信号含义解析:
信号名称 | 作用 |
---|---|
SIGHUP | 终端挂起或者控制进程结束时发出的信号,通常用于通知守护进程重新读取配置文件等。 |
SIGINT | 键盘中断信号,通常由用户按下 Ctrl+C 产生,用于终止正在运行的程序。 |
SIGQUIT | 键盘退出信号,通常由用户按下 Ctrl+\ 产生,用于使程序异常退出并产生核心转储文件(如果可能)。 |
SIGILL | 非法指令信号,表示程序执行了一条非法的机器指令。 |
SIGTRAP | 跟踪陷阱信号,用于调试程序,通常由断点触发。 |
SIGABRT | 异常终止信号,通常由程序内部的 abort 函数调用产生。 |
SIGBUS | 总线错误信号,通常表示访问内存时出现了总线错误。 |
SIGFPE | 浮点运算异常信号,例如除以零等浮点运算错误。 |
SIGKILL | 强制终止信号,无法被捕获或忽略,用于立即终止进程。 |
SIGUSR1 | 用户自定义信号 1,留给用户程序自定义用途。 |
SIGSEGV | 内存访问越界信号,通常表示程序尝试访问非法的内存地址。 |
SIGUSR2 | 用户自定义信号 2,留给用户程序自定义用途。 |
SIGPIPE | 管道破裂信号,当进程向一个没有读端的管道写入数据时产生。 |
SIGALRM | 闹钟信号,通常由 alarm 函数设置的定时器超时产生。 |
SIGTERM | 终止信号,是 kill 命令默认发送的信号,用于请求程序正常终止。 |
SIGSTKFLT | 协处理器栈错误信号,在某些特定架构的系统上使用。 |
SIGCHLD | 子进程状态改变信号,当子进程终止、暂停或继续运行时,父进程会收到此信号。 |
SIGCONT | 继续执行信号,用于使暂停的进程继续运行。 |
SIGSTOP | 暂停进程信号,无法被捕获或忽略,用于暂停进程的执行。 |
SIGTSTP | 终端停止信号,通常由用户按下 Ctrl+Z 产生,用于暂停前台进程的运行。 |
SIGTTIN | 后台进程从控制终端读取数据时收到的信号。 |
SIGTTOU | 后台进程向控制终端写入数据时收到的信号。 |
SIGURG | 紧急数据到达信号,通常用于网络编程中表示有紧急数据需要处理。 |
SIGXCPU | 超过 CPU 时间限制信号,表示进程超过了设定的 CPU 使用时间限制。 |
SIGXFSZ | 超过文件大小限制信号,表示进程试图扩大文件超过了系统限制。 |
SIGVTALRM | 虚拟定时器信号,用于在虚拟时间内设置定时器超时。 |
SIGPROF | 性能分析定时器信号,用于性能分析工具。 |
SIGWINCH | 窗口大小改变信号,当终端窗口大小发生改变时产生。 |
SIGIO | 异步 I/O 信号,表示异步 I/O 事件发生。 |
SIGPWR | 电源故障信号,在某些系统上表示电源状态发生变化。 |
SIGSYS | 系统调用错误信号,表示进程执行了一个无效的系统调用。 |
SIGRTMIN | 实时信号的最小值。 |
35 - 64 | SIGRTMIN+1 至 SIGRTMAX 是一系列的实时信号,用于实时应用程序中的优先级信号传递等 |
2、pkill与killall
pkill是ps命令和kill命令的结合,按照进程名来杀死指定进程,pkill和killall应用方法差不多,也是直接杀死运行中的程序,如果想杀掉单个进程,请用kill来杀掉。
语法:pkill/killall [选项] 进程名
三、进程类型
1、前台进程
在终端界面运行的进程,运行前台进程后,终端无法操作
# 将nginx调到前台运行
[root@localhost ~]# nginx -g "daemon off;"
[root@localhost ~]# ps aux | grep nginx
root 2553 0.0 0.0 4300 2992 pts/0 S+ 19:28 0:00 nginx: master process nginx -g daemon off;
nobody 2554 0.0 0.1 6028 3484 pts/0 S+ 19:28 0:00 nginx: worker process
root 2734 0.0 0.2 21988 8052 pts/1 S+ 19:28 0:00 grep --color=auto nginx
- 将进程调到前台运行
fg 1
[root@localhost ~]# fg 1
nginx -g "daemon off;"
- 将正在运行的前台进程放到后台运行
ctrl + z
bg 1
[root@localhost ~]# bg 1
[1]+ nginx -g "daemon off;" &
- 将前台进程放到后台运行
firefox &
注意:该运行前台进程的方式,当终端关闭时,进程也会随着关闭
nohup firefox & #关闭终端,进程不掉
查看: jobs
[root@localhost ~]# jobs
[1]+ 运行中 nginx -g "daemon off;" &
2、后台进程
驻留在后端运行的进程