Project Icon

sysinfo

Rust编写的多系统资源监控库

sysinfo是一个Rust编写的系统信息获取库,支持多种主流操作系统。该库提供简洁的API,用于获取CPU、内存、磁盘、网络和硬件组件等系统资源信息。sysinfo具有多线程支持,提供性能优化建议,并可通过C接口使用。这使其成为开发系统监控和资源管理应用的理想选择。

sysinfo

sysinfo 是一个用于获取系统信息的 crate。

支持的操作系统

目前支持以下操作系统(按字母顺序排列):

  • 安卓
  • FreeBSD
  • iOS
  • Linux
  • macOS
  • 树莓派
  • Windows

你仍然可以在不支持的操作系统上使用 sysinfo,它只会什么都不做并始终返回空值。你可以通过检查 [IS_SUPPORTED_SYSTEM] 常量直接在程序中检查是否支持某个操作系统。

支持的最低 rustc 版本是 1.74

使用方法

如果你想从旧版本迁移,不妨查看 CHANGELOG迁移指南

⚠️ 在尝试读取不同结构体的信息之前,你需要更新它们以获取最新信息,因为对于大多数情况,它是基于当前值和旧值之间的差异工作的。

这就是为什么保留同一个 [System] 实例比多次重新创建它要好得多。

你可以在 examples 文件夹中找到一个示例。你可以通过 cargo run --example simple 运行它。

否则,这里有一个简短的代码示例:

use sysinfo::{
    Components, Disks, Networks, System,
};

// 请注意,我们使用 "new_all" 来确保填充所有 CPU 和进程列表!
let mut sys = System::new_all();

// 首先我们更新 `System` 结构体的所有信息。
sys.refresh_all();

println!("=> 系统:");
// RAM 和交换分区信息:
println!("总内存:{} 字节", sys.total_memory());
println!("已用内存:{} 字节", sys.used_memory());
println!("总交换分区:{} 字节", sys.total_swap());
println!("已用交换分区:{} 字节", sys.used_swap());

// 显示系统信息:
println!("系统名称:{:?}", System::name());
println!("系统内核版本:{:?}", System::kernel_version());
println!("系统操作系统版本:{:?}", System::os_version());
println!("系统主机名:{:?}", System::host_name());

// CPU 数量:
println!("CPU 数量:{}", sys.cpus().len());

// 显示进程 ID、名称和磁盘使用情况:
for (pid, process) in sys.processes() {
    println!("[{pid}] {:?} {:?}", process.name(), process.disk_usage());
}

// 我们显示所有磁盘的信息:
println!("=> 磁盘:");
let disks = Disks::new_with_refreshed_list();
for disk in &disks {
    println!("{disk:?}");
}

// 网络接口名称、总接收数据和总发送数据:
let networks = Networks::new_with_refreshed_list();
println!("=> 网络:");
for (interface_name, data) in &networks {
    println!(
        "{interface_name}:{} B(下载)/ {} B(上传)",
        data.total_received(),
        data.total_transmitted(),
    );
    // 如果你想要自上次调用 `Networks::refresh` 以来接收/发送的数据量,
    // 使用 `received`/`transmitted`。
}

// 组件温度:
let components = Components::new_with_refreshed_list();
println!("=> 组件:");
for component in &components {
    println!("{component:?}");
}

请记住,要获取一些最新信息,你需要调用相应的 refresh 方法。例如,对于 CPU 使用率:

use sysinfo::System;

let mut sys = System::new();

loop {
    sys.refresh_cpu_usage(); // 刷新 CPU 使用率。
    for cpu in sys.cpus() {
        print!("{}% ", cpu.cpu_usage());
    }
    // 休眠一段时间,让系统运行足够长的时间以获得有用的信息。
    std::thread::sleep(sysinfo::MINIMUM_CPU_UPDATE_INTERVAL);
}

默认情况下,sysinfo 使用多线程。但是,这可能会增加某些平台(如 macOS)的内存使用。可以通过在 Cargo.toml 中设置 default-features = false(这会禁用 multithread cargo 特性)来禁用此行为。

最佳实践 / 性能提示

大多数情况下,你不需要 sysinfo 提供的所有信息,而只需要其中的一部分。在这种情况下,建议只使用 refresh_specifics(...) 方法获取你需要的内容,以获得更好的性能。

另一个经常遇到的问题:除非你知道自己在做什么,否则几乎总是最好实例化 System 结构体一次,并在整个程序中使用这个实例。原因是因为许多信息需要之前的测量才能计算(例如 CPU 使用率)。另一个例子说明为什么这样做更好:如果你想列出所有正在运行的进程,sysinfo 需要为 Process 结构体列表分配所有内存,这在第一次运行时需要相当长的时间。

如果你的程序需要使用大量文件描述符,最好使用:

sysinfo::set_open_files_limit(0);

因为 sysinfo 保持一定数量的文件描述符打开,以在某些目标上刷新进程时获得更好的性能。

在树莓派上运行

在树莓派上构建可能会有困难。一个好的解决方法是交叉编译,然后将可执行文件发送到你的树莓派。

首先安装 arm 工具链,例如在 Ubuntu 上:

> sudo apt-get install gcc-multilib-arm-linux-gnueabihf

然后配置 cargo 使用相应的工具链:

cat << EOF > ~/.cargo/config
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
EOF

最后,进行交叉编译:

rustup target add armv7-unknown-linux-gnueabihf
cargo build --target=armv7-unknown-linux-gnueabihf

Docker 上的 Linux 和 Windows 子系统 Linux(WSL)

虚拟 Linux 系统,如通过 Docker 和 Windows 子系统 Linux(WSL)运行的系统,不会通过 /sys/class/hwmon/sys/class/thermal 接收主机硬件信息。因此,在虚拟系统上使用此库查询组件可能会返回无结果(或意外结果)。

在 macOS 或 iOS 沙盒/应用商店内运行的二进制文件中使用

苹果对通过应用商店分发的二进制文件可以链接的 API 有限制。默认情况下,sysinfo 与这些限制不兼容。你可以使用 apple-app-store 特性标志来禁用 Apple 禁止的功能。这也会启用 apple-sandbox 特性。对于在应用商店之外使用沙盒的应用程序,可以单独使用 apple-sandbox 特性来避免在运行时造成策略违反。

工作原理

我写了一篇博客文章,你可以在这里找到,解释了 sysinfo 如何在不同系统上提取信息。

C 接口

可以直接从 C 语言使用这个 crate。查看 Makefileexamples/simple.c 文件。

要构建 C 示例,只需运行:

> make
> ./simple
# 如果需要:
> LD_LIBRARY_PATH=target/debug/ ./simple

基准测试

你可以通过以下方式在本地运行基准测试(需要 rust nightly 版本):

> cargo bench

捐赠

如果你欣赏我的工作并想支持我,你可以通过 github sponsorspatreon 进行捐赠。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

白日梦AI

白日梦AI提供专注于AI视频生成的多样化功能,包括文生视频、动态画面和形象生成等,帮助用户快速上手,创造专业级内容。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

讯飞绘镜

讯飞绘镜是一个支持从创意到完整视频创作的智能平台,用户可以快速生成视频素材并创作独特的音乐视频和故事。平台提供多样化的主题和精选作品,帮助用户探索创意灵感。

Project Cover

讯飞文书

讯飞文书依托讯飞星火大模型,为文书写作者提供从素材筹备到稿件撰写及审稿的全程支持。通过录音智记和以稿写稿等功能,满足事务性工作的高频需求,帮助撰稿人节省精力,提高效率,优化工作与生活。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号