## 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` 常用于进程控制 - 排查问题时,通常从“进程是否存在、状态是否正常、资源占用是否异常”这条线入手