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
每月下载量 1,499,209
在 1,470 个 包中(直接使用 484 个)
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。查看 Makefile
和 examples/simple.c
文件。
要构建 C 示例,只需运行
> make
> ./simple
# If needed:
> LD_LIBRARY_PATH=target/debug/ ./simple
基准测试
你可以使用 rust nightly 在本地运行基准测试
> cargo bench
捐赠
如果你欣赏我的工作并想支持我,你可以通过 github sponsors 或 patreon 来支持。
依赖关系
~0–36MB
~542K SLoC