加入 emoji 节标志
All checks were successful
CI / lint-and-build (push) Successful in 24s
CD / deploy (push) Successful in 8s

This commit is contained in:
2026-06-14 12:41:37 +08:00
parent 26a5f99587
commit 83ac6179dc

View File

@@ -12,13 +12,13 @@
<img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="license"> <img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="license">
</p> </p>
## 项目简介 ## 📖 项目简介
`syscall_monitor` 在 Linux 内核 `raw_syscalls:sys_enter` 跟踪点上挂载一段 eBPF 程序,按系统调用号在内核态做哈希计数;用户态由 Python 每秒读取一次快照,并在 Flask Web 页面上展示配置项中关心的系统调用调用次数。 `syscall_monitor` 在 Linux 内核 `raw_syscalls:sys_enter` 跟踪点上挂载一段 eBPF 程序,按系统调用号在内核态做哈希计数;用户态由 Python 每秒读取一次快照,并在 Flask Web 页面上展示配置项中关心的系统调用调用次数。
由于挂载 eBPF 需要内核能力CAP_BPF / root整个程序必须以 root 权限运行。 由于挂载 eBPF 需要内核能力CAP_BPF / root整个程序必须以 root 权限运行。
## 主要特性 ## 主要特性
- 内核态全量计数用户态按需展示BPF 程序对所有系统调用号自增计数,配置变化无需重新挂载探针。 - 内核态全量计数用户态按需展示BPF 程序对所有系统调用号自增计数,配置变化无需重新挂载探针。
- 可在 Web 页面动态增删需要监控的系统调用名称,无需重启进程。 - 可在 Web 页面动态增删需要监控的系统调用名称,无需重启进程。
@@ -26,7 +26,7 @@
- 后台采集线程 + 配置文件原子写入(`tmp``replace`),并发读写不丢更新。 - 后台采集线程 + 配置文件原子写入(`tmp``replace`),并发读写不丢更新。
- 提供 `setup.sh` / `run.sh` / `stop.sh` 三个部署脚本,配套 Gitea Actions CI/CD 工作流。 - 提供 `setup.sh` / `run.sh` / `stop.sh` 三个部署脚本,配套 Gitea Actions CI/CD 工作流。
## 技术栈 ## 🧰 技术栈
| 类别 | 选型 | 来源 | | 类别 | 选型 | 来源 |
|------|------|------| |------|------|------|
@@ -37,7 +37,7 @@
| 前端 | 服务端模板 + 原生 JS `fetch` 轮询 | [web/templates/](web/templates/) | | 前端 | 服务端模板 + 原生 JS `fetch` 轮询 | [web/templates/](web/templates/) |
| CI/CD | Gitea Actionsself-hosted runner | [.gitea/workflows/](.gitea/workflows/) | | CI/CD | Gitea Actionsself-hosted runner | [.gitea/workflows/](.gitea/workflows/) |
## 项目结构 ## 📁 项目结构
```text ```text
syscall_monitor/ syscall_monitor/
@@ -66,7 +66,7 @@ syscall_monitor/
└── LICENSE └── LICENSE
``` ```
## 模块关系 ## 🧬 模块关系
```mermaid ```mermaid
flowchart LR flowchart LR
@@ -80,7 +80,7 @@ flowchart LR
Flask -->|/config| ConfigPage[配置页] Flask -->|/config| ConfigPage[配置页]
``` ```
## 快速开始 ## 🚀 快速开始
### 环境要求 ### 环境要求
@@ -129,7 +129,7 @@ sudo ./run.sh
sudo ./stop.sh sudo ./stop.sh
``` ```
## 接口 ## 🔌 接口
| 方法 | 路径 | 处理函数 | 说明 | | 方法 | 路径 | 处理函数 | 说明 |
|------|------|----------|------| |------|------|----------|------|
@@ -140,7 +140,7 @@ sudo ./stop.sh
来源:[web/app.py](web/app.py)。 来源:[web/app.py](web/app.py)。
## 部署 ## 🚢 部署
仓库内附带的 Gitea Actions 工作流面向 **self-hosted Linux runner** 仓库内附带的 Gitea Actions 工作流面向 **self-hosted Linux runner**
@@ -149,16 +149,16 @@ sudo ./stop.sh
完整的 runner 准备步骤(系统包安装、部署目录创建、免密 sudo 配置等)见 [.gitea/README.md](.gitea/README.md)。 完整的 runner 准备步骤(系统包安装、部署目录创建、免密 sudo 配置等)见 [.gitea/README.md](.gitea/README.md)。
## 开发说明 ## 🛠️ 开发说明
- `main.py``app.run(..., use_reloader=False)` 是关键:开启 Flask 自动重载会让主进程被 fork导致 eBPF 探针被加载两次而冲突。 - `main.py``app.run(..., use_reloader=False)` 是关键:开启 Flask 自动重载会让主进程被 fork导致 eBPF 探针被加载两次而冲突。
- BPF 程序在内核里对**所有**系统调用号计数,过滤逻辑放在 Python 端 `_refresh_snapshot()` 里,因此修改配置无需重建 BPF 程序。 - BPF 程序在内核里对**所有**系统调用号计数,过滤逻辑放在 Python 端 `_refresh_snapshot()` 里,因此修改配置无需重建 BPF 程序。
- `SyscallTracer` 通过模块级 `_tracer` 单例保证 BPF 程序在进程内只挂载一次。 - `SyscallTracer` 通过模块级 `_tracer` 单例保证 BPF 程序在进程内只挂载一次。
## 安全与隐私 ## 🔒 安全与隐私
运行该程序需要 root / CAP_BPF 权限,会读取整机所有进程的系统调用频率信息,请勿在不受信任的环境或未脱敏的多租户主机上长期开启。监听地址默认 `0.0.0.0:5000`,对外暴露前请自行加上反向代理与访问控制。 运行该程序需要 root / CAP_BPF 权限,会读取整机所有进程的系统调用频率信息,请勿在不受信任的环境或未脱敏的多租户主机上长期开启。监听地址默认 `0.0.0.0:5000`,对外暴露前请自行加上反向代理与访问控制。
## 许可证 ## 📄 许可证
本项目以 MIT License 发布,详见 [LICENSE](LICENSE)。 本项目以 MIT License 发布,详见 [LICENSE](LICENSE)。