206 lines
3.7 KiB
Markdown
206 lines
3.7 KiB
Markdown
## 1、进程概览
|
||
|
||
进程是程序的一次运行实例,是操作系统进行资源分配和调度的基本单位。
|
||
|
||
可以简单理解为:
|
||
|
||
- **程序**:静态文件
|
||
- **进程**:程序运行起来后的动态实体
|
||
|
||
## 2、进程的基本状态
|
||
|
||
常见运行状态包括:
|
||
|
||
- **创建状态**:进程刚被创建
|
||
- **就绪状态**:已准备运行,等待分配 CPU
|
||
- **运行状态**:正在执行
|
||
- **阻塞状态**:等待某些资源或事件,例如 I/O
|
||
- **终止状态**:执行结束或异常退出
|
||
|
||
在 Linux 中,`ps`、`top` 等命令里更常看到下面这些状态码:
|
||
|
||
- `R`:Running,运行中或在运行队列中
|
||
- `S`:Sleeping,可中断睡眠
|
||
- `D`:Uninterruptible Sleep,不可中断睡眠,常见于 I/O 等待
|
||
- `T`:Stopped,被暂停或被调试
|
||
- `Z`:Zombie,僵尸进程
|
||
|
||
## 3、进程、线程、协程
|
||
|
||
### 3.1 线程
|
||
|
||
线程是进程中的执行流,是 CPU 调度的基本执行单位之一。一个进程可以包含多个线程。
|
||
|
||
### 3.2 协程
|
||
|
||
协程通常由用户态程序自己调度,切换开销更小,适合高并发编程场景。
|
||
|
||
在日常 Linux 运维里,最常关注的仍然是**进程**和**线程**。
|
||
|
||
## 4、进程类型
|
||
|
||
- **守护进程**:后台长期运行、通常不依赖终端,例如各种服务进程
|
||
- **前台进程**:与当前终端交互的进程
|
||
- **后台进程**:由当前 shell 启动但放到后台运行的进程
|
||
|
||
## 5、常用查看命令
|
||
|
||
### 5.1 `pstree`
|
||
|
||
用于查看进程树关系。
|
||
|
||
常见选项:
|
||
|
||
- `-p`:显示 PID
|
||
- `-T`:不显示线程
|
||
- `-u`:显示用户切换
|
||
- `-H`:高亮指定进程及其祖先进程
|
||
|
||
示例:
|
||
|
||
```shell
|
||
pstree -p
|
||
```
|
||
|
||
### 5.2 `ps`
|
||
|
||
用于查看进程快照。
|
||
|
||
常见选项:
|
||
|
||
- `a`:显示所有终端相关进程
|
||
- `x`:显示不依赖终端的进程
|
||
- `u`:显示用户信息
|
||
- `f`:树状显示父子关系
|
||
|
||
高频示例:
|
||
|
||
```shell
|
||
ps aux
|
||
ps -ef
|
||
ps auxf
|
||
```
|
||
|
||
### 5.3 `pidof` 与 `pgrep`
|
||
|
||
```shell
|
||
pidof nginx
|
||
pgrep nginx
|
||
```
|
||
|
||
适合快速查找某个进程的 PID。
|
||
|
||
### 5.4 `top` 与 `htop`
|
||
|
||
- `top`:动态查看系统负载、CPU、内存、进程情况
|
||
- `htop`:更友好的交互式进程查看工具
|
||
|
||
### 5.5 `pmap`
|
||
|
||
```shell
|
||
pmap PID
|
||
```
|
||
|
||
用于查看进程内存映射。
|
||
|
||
### 5.6 `vmstat`
|
||
|
||
```shell
|
||
vmstat 1
|
||
```
|
||
|
||
用于观察系统整体运行情况,如 CPU、内存、上下文切换、I/O 等。
|
||
|
||
### 5.7 `iostat`
|
||
|
||
```shell
|
||
iostat
|
||
```
|
||
|
||
用于查看 CPU 和磁盘 I/O 情况,通常来自 `sysstat` 软件包。
|
||
|
||
### 5.8 `lsof`
|
||
|
||
```shell
|
||
lsof -p PID
|
||
```
|
||
|
||
用于查看某个进程打开了哪些文件、端口、套接字。
|
||
|
||
## 6、进程控制命令
|
||
|
||
### 6.1 `kill`
|
||
|
||
用于按 PID 发送信号。
|
||
|
||
```shell
|
||
kill PID
|
||
kill -9 PID
|
||
```
|
||
|
||
### 6.2 `pkill`
|
||
|
||
用于按进程名或条件杀进程。
|
||
|
||
```shell
|
||
pkill nginx
|
||
```
|
||
|
||
### 6.3 `nohup`
|
||
|
||
用于让命令在退出终端后继续运行。
|
||
|
||
```shell
|
||
nohup command &
|
||
```
|
||
|
||
### 6.4 `jobs`、`bg`、`fg`
|
||
|
||
这些命令用于 shell 作业控制:
|
||
|
||
- `jobs`:查看当前 shell 的作业
|
||
- `bg`:把任务放到后台继续执行
|
||
- `fg`:把后台任务切回前台
|
||
|
||
## 7、常见排障场景
|
||
|
||
### 7.1 查某个服务是否存在
|
||
|
||
```shell
|
||
ps -ef | grep nginx
|
||
pgrep nginx
|
||
```
|
||
|
||
### 7.2 查谁占用 CPU 高
|
||
|
||
```shell
|
||
top
|
||
htop
|
||
```
|
||
|
||
### 7.3 查进程打开了哪些文件
|
||
|
||
```shell
|
||
lsof -p PID
|
||
```
|
||
|
||
### 7.4 查进程内存映射
|
||
|
||
```shell
|
||
pmap PID
|
||
```
|
||
|
||
### 7.5 查僵尸进程
|
||
|
||
```shell
|
||
ps aux | grep ' Z '
|
||
```
|
||
|
||
## 8、小结
|
||
|
||
- 进程是资源分配和调度的核心对象
|
||
- `R`、`S`、`D`、`T`、`Z` 是最常见的进程状态
|
||
- `ps`、`pstree`、`top`、`htop`、`lsof` 是高频排障命令
|
||
- `kill`、`pkill`、`nohup`、`jobs`、`bg`、`fg` 常用于进程控制
|
||
- 排查问题时,通常从“进程是否存在、状态是否正常、资源占用是否异常”这条线入手
|