# 进程管理

在命令行中查看并管理进程。

## 查看 PID

查看 PID 的方法有多种，包括通过使用基础的 `ps` 命令，或使用可视化的 top 系列命令，而 Linux 更多倾向于使用后者。

### ps 命令

Linux 的每个进程都会创建一个 PID，作为该进程的唯一标识，`ps -He` 可以查看所有的进程 PID 的树状结构，可以通过 `|` 管道传入 `grep` 命令对输出结果进行筛选。

查询包含 `code` 字符串的进程：

```bash
ps -e | grep -i code
```

> `-i` 表示忽略 grep 查询对大小的限制筛选。

例如产生以下输出：

```txt
   3289 ?        00:00:37     code
   3292 ?        00:00:00       code
   3337 ?        00:00:59         code
   3293 ?        00:00:00       code
   3295 ?        00:00:00         code
   3379 ?        00:03:21           code
   3339 ?        00:00:01       code
   3412 ?        00:00:06       code
   3498 ?        00:00:02       code
   3511 ?        00:00:27       code
   3608 ?        00:00:00         code
   3627 ?        00:00:06         code
```

后续若要对进程进行操作，仅需操作根进程的 PID 即可，即 `3289`。

更多用法查看 PID 适用 `ps` 命令，使用 `man ps` 或 `ps --help` 命令获得帮助。

### top 系列命令

目前有几款不同的 top，包括 `top` `htop` `btop` `atop` 等，其中 `htop` 以高实用性受欢迎，`btop` 颜值最高，但对终端窗口大小有限制，过小的窗口无法启动，此处以 `htop` 作为示例，`top` 之外的 top 系列命令在绝大多数发行版中需要手动安装。

```bash
htop
```

终端输入 `htop` 后将会显示所有的 PID 与各类资源占用情况，同时可以使用键盘交互式地查找或操作一些进程。

## 查看资源占用

使用 top 系列命令可以查询系统常用资源的占用，也是最常见的方法之一，但针对特定资源，有特定的命令进行查询。

### 常用资源占用

`htop` 或其他系列命令将显示常用资源的占用情况，包括 CPU 占用，内存占用，线程数，PID 信息等。

### 内存占用

`free` 命令查看运行内存占用情况，常用以下命令进行查看：

```bash
free -h
```

`-h` 将忽略具体大小，以 MB 或 GB 单位进行显示。

### 查看流量进出速度

使用 `nload` 命令可以查看流量进出速度，进出速度将显示分为两个列表显示。

### 查看端口占用情况

`lsof` 查看端口占用

```txt
lsof -i:端口号
```

`netstat` 包含在 `net-tools` 软件包中，默认不会安装在绝大多数发行版中，需要手动安装。

常用参数如下

使用 `-tunlp` 参数列出所有监听协议端口占用情况，通过管道传入 `grep` 进行过滤以达到查询端口被哪个进程占用的效果。

```bash
netstat -tunlp | grep 
```

## 结束进程

常用的结束进程的方法有使用 `kill` 匹配进程 PID 进行结束，或使用 `pkill` 匹配进程名进行结束。

### kill 命令

使用 `kill [-n] PID` 以杀掉命令，其中 `n` 表示要发送的数字信号，常用信号如下

- SIGKILL（信号9）：立即结束进程，不能被捕获或忽略。

- SIGTERM（信号15）：正常结束进程，可以被捕获或忽略。

- SIGINT（信号2）：通常是Ctrl+C产生的信号，可以被进程捕获或忽略。

例如查询到 code 进程 PID 为 3389，现在要杀掉该进程，使用如下命令：

```bash
kill 3389
```

或指定信号，强制结束：

```bash
kill -9 3389
```

### pkill 命令

pkill 命令可以匹配进程名来杀掉进程，例如杀掉进程名为 `code` 的命令：

```bash
pkill code
```

有时进程名过长，可以使用 `-f` 选项杀掉所有包含某个字符串的进程名的进程，例如杀掉 `prismlauncher` 进程可以使用如下命令：

```bash
pkill -f prism
```