#系统信息 #磁盘 #CPU #网络 #进程 #树莓派 #macOS/iOS

sysinfo

用于获取系统信息(如进程、CPU、磁盘、组件和网络)的库

236次发布

新版本 0.31.3 2024年8月23日
0.31.0 2024年7月31日
0.30.7 2024年3月6日
0.30.3 2023年12月29日
0.0.2 2015年7月25日

操作系统 类别下排名 1

Download history 341526/week @ 2024-05-03 358099/week @ 2024-05-10 355895/week @ 2024-05-17 346192/week @ 2024-05-24 368087/week @ 2024-05-31 327052/week @ 2024-06-07 343360/week @ 2024-06-14 358304/week @ 2024-06-21 319143/week @ 2024-06-28 339411/week @ 2024-07-05 355619/week @ 2024-07-12 367311/week @ 2024-07-19 357880/week @ 2024-07-26 355711/week @ 2024-08-02 371509/week @ 2024-08-09 345844/week @ 2024-08-16

每月下载量 1,499,209
1,470 包中(直接使用 484 个)

使用 MIT 许可证

700KB
16K SLoC

sysinfo

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

支持的操作系统

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

  • Android
  • FreeBSD
  • iOS
  • Linux
  • macOS
  • Raspberry Pi
  • Windows

您仍然可以在不支持的操作系统中使用 sysinfo,它将简单地什么也不做,并始终返回空值。您可以直接在程序中检查是否支持该操作系统,方法是在 IS_SUPPORTED_SYSTEM 常量中。

支持的 rustc 的最低版本是 1.74

使用方法

如果您想从旧版本迁移,不妨看看 变更日志迁移指南

⚠️ 在尝试读取不同结构的详细信息之前,您需要更新它们以获取最新信息,因为对于大多数结构,它通过比较当前值和旧值来实现。

因此,最好保留相同的 System 实例,而不是多次重新创建它。

examples 文件夹中有一个示例。您可以使用以下命令运行它:cargo run --example simple

否则,这里有一些代码示例

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

// Please note that we use "new_all" to ensure that all lists of
// CPUs and processes are filled!
let mut sys = System::new_all();

// First we update all information of our `System` struct.
sys.refresh_all();

println!("=> system:");
// RAM and swap information:
println!("total memory: {} bytes", sys.total_memory());
println!("used memory : {} bytes", sys.used_memory());
println!("total swap  : {} bytes", sys.total_swap());
println!("used swap   : {} bytes", sys.used_swap());

// Display system information:
println!("System name:             {:?}", System::name());
println!("System kernel version:   {:?}", System::kernel_version());
println!("System OS version:       {:?}", System::os_version());
println!("System host name:        {:?}", System::host_name());

// Number of CPUs:
println!("NB CPUs: {}", sys.cpus().len());

// Display processes ID, name na disk usage:
for (pid, process) in sys.processes() {
    println!("[{pid}] {:?} {:?}", process.name(), process.disk_usage());
}

// We display all disks' information:
println!("=> disks:");
let disks = Disks::new_with_refreshed_list();
for disk in &disks {
    println!("{disk:?}");
}

// Network interfaces name, total data received and total data transmitted:
let networks = Networks::new_with_refreshed_list();
println!("=> networks:");
for (interface_name, data) in &networks {
    println!(
        "{interface_name}: {} B (down) / {} B (up)",
        data.total_received(),
        data.total_transmitted(),
    );
    // If you want the amount of data received/transmitted since last call
    // to `Networks::refresh`, use `received`/`transmitted`.
}

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

请记住,为了获得一些最新信息,您需要调用等效的 refresh 方法。例如,对于CPU使用情况

use sysinfo::System;

let mut sys = System::new();

loop {
    sys.refresh_cpu_usage(); // Refreshing CPU usage.
    for cpu in sys.cpus() {
        print!("{}% ", cpu.cpu_usage());
    }
    // Sleeping to let time for the system to run for long
    // enough to have useful information.
    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 保持打开一些文件描述符以在刷新进程时在目标上获得更好的性能。

在 Raspberry Pi 上运行

在 Raspberry Pi 上构建会比较困难。一种好的方法是交叉编译,然后将可执行文件发送到你的 Raspberry Pi。

首先安装 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

Linux 在 Docker 和 Windows Subsystem for Linux (WSL) 上

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

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

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

工作原理

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

C 接口

可以直接从 C 使用此 crate。查看 Makefileexamples/simple.c 文件。

要构建 C 示例,只需运行

> make
> ./simple
# If needed:
> LD_LIBRARY_PATH=target/debug/ ./simple

基准测试

你可以使用 rust nightly 在本地运行基准测试

> cargo bench

捐赠

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

依赖关系

~0–36MB
~542K SLoC