# sysinfod **Repository Path**: lanceye/sysinfod ## Basic Information - **Project Name**: sysinfod - **Description**: Linux 系统信息监控守护进程。通过读取 `/proc` 文件系统和系统调用(`sysinfo()`、`statfs()` 等)采集 CPU、内存、磁盘、网络、进程等指标,通过嵌入式 HTTP 服务器(libevent)提供 REST API,并定时推送 JSON 数据到远程监控平台。 - **Primary Language**: C - **License**: MulanPSL-1.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-04 - **Last Updated**: 2026-07-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # sysinfod Linux 系统信息监控守护进程。通过读取 `/proc` 文件系统和系统调用(`sysinfo()`、`statfs()` 等)采集 CPU、内存、磁盘、网络、进程等指标,通过嵌入式 HTTP 服务器(libevent)提供 REST API,并定时推送 JSON 数据到远程监控平台。 ## 功能特性 - **CPU**: 使用率百分比、核心数、系统启动时间、OS 发行版名称 - **内存**: 物理内存总量/空闲/已用、交换空间总量/空闲、进程数、内存单元大小 - **磁盘**: 已挂载文件系统列表(设备、挂载点、类型、块大小、总块数、空闲块、可用块、空闲 inode) - **网络**: 收发总字节数、TCP 连接详情(IP/端口/状态/队列/定时器等 22 个字段) - **进程**: 运行中进程列表(PID、命令、路径、用户、内存占用、进程名) - **HTTP API**: 7 个 REST 端点 + 远程推送 - **远程推送**: 定时 POST 聚合 JSON 到远程服务器 ## 依赖 - libevent(`libevent`、`libevent_core`、`libevent_pthreads`) - pthreads - CMake >= 3.15 - 仅支持 Linux ## 构建 ```bash mkdir build && cd build cmake .. make ``` 将 `config.json` 放在可执行文件同目录下(或运行时的当前工作目录)。 ## 配置 启动时从 `config.json` 读取配置,文件不存在或解析失败时使用硬编码默认值。 **示例 `config.json`:** ```json { "DEFAULT_PORT": 9801, "PULL_SYS_INFO_INTERVAL": 10, "SERVER_URL": "http://172.16.132.7/monitor/server/info", "TOKEN": "CHANGE_THIS_TO_A_STRONG_TOKEN" } ``` | 键 | 默认值 | 说明 | |----|--------|------| | `DEFAULT_PORT` | `9801` | HTTP 本地监控端口(daemon 模式) | | `PULL_SYS_INFO_INTERVAL` | `10` | 采集间隔(秒) | | `SERVER_URL` | `http://172.16.132.7/monitor/server/info` | 远程推送地址 | | `TOKEN` | `CHANGE_THIS_TO_A_STRONG_TOKEN` | HTTP API 鉴权令牌(建议 >= 8 字符) | > **安全提醒**: 默认 TOKEN 会在启动时输出告警;建议使用 8 字符以上的强密码。令牌通过常量时间比较防止时序侧信道攻击,但通信仍为明文 HTTP,勿在公网使用。 ## 运行模式 ### 纯推送模式(默认) ```bash ./sysinfod ``` 程序无限循环仅执行远程推送,**HTTP API 服务器不会启动**。 ### 守护进程模式 ```bash ./sysinfod -d # 或 ./sysinfod --daemon ``` 程序会: - 双 fork 脱离终端 - 使用 `/tmp/sysinfod` 文件锁保证单实例运行 - 将 stdin/stdout/stderr 重定向到 `/dev/null` - 后台线程定时推送数据,主线程启动 HTTP API 服务器 - 注册 `SIGINT`/`SIGTERM` 信号处理实现优雅退出 ## HTTP API 端点 所有端点绑定到 `0.0.0.0:端口`。除 404 回退外,**所有端点均需在请求头中携带 `TOKEN` 字段进行鉴权**(值在 `config.json` 中配置)。 **请求示例:** ```bash curl -H "TOKEN: your_token" http://localhost:9801/cpu ``` | 方法 | 路径 | 说明 | 返回格式 | |------|------|------|----------| | GET | `/cpu` | CPU 使用率百分比(采样 1 秒) | `{"usage":""}` | | GET | `/cores` | CPU 核心数 | `{"cores":}` | | GET | `/start_time` | 系统启动时间 | `{"start_time":"YYYY-MM-DD HH:MM:SS"}` | | GET | `/mem` | 内存与交换空间统计 | `{"totalram":"...","freeram":"...","totalswap":"...","freeswap":"...","procs":"...","mem_unit":"..."}` | | GET | `/disk` | 已挂载文件系统 | JSON 数组 | | GET | `/process` | 运行进程列表 | JSON 数组 | | GET | `/net_info` | 网络收发总字节 | `{"rec":,"rev":}` | | — | 远程推送 | POST 聚合数据到 `SERVER_URL` | 见下方 | ## 远程推送 - **方式**: HTTP POST - **地址**: `config.json` 中 `SERVER_URL` - **间隔**: `config.json` 中 `PULL_SYS_INFO_INTERVAL`(秒) - **连接超时**: 5 秒 ### 推送 JSON 格式 ```json { "start_time": "<启动时间>", "os_name_version": "<发行版名> @x86_64", "cpu_usage": "<使用率>", "process": "<进程 JSON 字符串>", "disk_info": "<磁盘 JSON 字符串>", "cores": "<核心数>", "mem_usage": "<内存 JSON 字符串>", "net_info": "{\"rev\":,\"send\":,\"tcp_num\":}", "connections": "" } ``` > 所有字段均为字符串类型,嵌套 JSON 对象被双重编码(stringified JSON)。 ## 数据来源 | 系统文件/调用 | 模块 | 采集内容 | |--------------|------|----------| | `/proc/stat` | CPU | 累计 CPU tick | | `/etc/os-release`, `/etc/*-release` | CPU | 发行版名称/版本 | | `sysinfo()` | CPU/内存 | 启动时间、内存/交换统计 | | `uname()` | CPU | 内核版本、架构 | | `/proc/mounts` + `statfs()` | 磁盘 | 挂载点、块/ inode 信息 | | `/proc/net/dev` | 网络 | 接口收发字节 | | `/proc/net/tcp` | 网络 | TCP 连接详情(22 个字段) | | `/proc//{cmdline,exe,status}` | 进程 | 命令、路径、内存、用户 | ## 已知问题 1. `/cpu` 端点采样 CPU 使用率时阻塞约 1 秒 2. `/process` 端点遍历所有进程,在进程数多时响应较慢 3. `/etc/os-release` 解析依赖 `PRETTY_NAME`/`NAME`/`VERSION` 标准字段,非标准格式可能回退到 `uname()` 4. 通信使用明文 HTTP,令牌和系统数据存在中间人窃听风险,建议仅在可信内网使用 ## 致谢 本项目基于 [sysinfod](https://gitee.com/28250164/sysinfod) 进行二次开发,感谢原作者的贡献。 ## 许可证 本项目基于 GNU General Public License v3.0 发行。