sysinfo是用於獲取系統信息的板條箱。
它目前支持以下OS(按字母順序排序):
您仍然可以在非支撐OSS上使用sysinfo ,它將簡單地做任何事情並始終返回空值。您可以通過檢查[ IS_SUPPORTED_SYSTEM ]常數來直接檢查程序。
rustc的最低支持版本為1.74 。
如果您想從舊版本遷移,請隨時查看ChangElog和遷移指南。
這就是為什麼要保持同一[ 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貨物功能)。
在大多數情況下,您不希望sysinfo提供的所有信息,而只是其中的一部分。在這種情況下,建議使用refresh_specifics(...)方法,只有您需要更好的性能。
另一個問題經常遇到:除非您知道自己在做什麼,否則幾乎最好是實例化System結構並通過程序使用此實例。原因是因為許多信息需要先前要計算的措施(例如,CPU使用情況)。另一個示例為什麼要好得多:如果您想列出所有運行過程, sysinfo需要為Process結構列表分配所有內存,這在第一次運行中需要很長時間。
如果您的程序需要使用大量文件描述符,則最好使用:
sysinfo :: set_open_files_limit ( 0 ) ;隨著sysinfo保持許多文件描述符,在刷新過程時在某些目標上具有更好的性能。
在覆盆子pi上很難建立。一個很好的方法是跨構建,然後將可執行文件發送到覆盆子Pi。
首先安裝ARM工具鏈,例如在Ubuntu上:
> sudo apt-get install gcc-multilib-arm-linux-gnueabihf然後配置貨物以使用相應的工具鏈:
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子系統運行的Linux(WSL)的系統,無法通過/sys/class/hwmon或/hwmon或/sys/class/thermal接收主機硬件信息。因此,在虛擬系統上使用此庫時,對組件的查詢可能不會返回結果(或意外結果)。
蘋果對哪些API可以鏈接到通過App Store分發的二進製文件有限制。默認情況下, sysinfo與這些限制不兼容。您可以使用apple-app-store功能標誌來禁用Apple禁止的功能。這也啟用了apple-sandbox功能。對於使用App Store外部的Sandbox的應用程序,可以單獨使用apple-sandbox功能,以避免在運行時造成違反政策違規行為。
我寫了一篇博客文章,您可以在此處找到,其中解釋了sysinfo如何提取有關不同系統的信息。
可以直接從C Makefile使用此板條examples/simple.c
要構建C示例,只需運行:
> make
> ./simple
# If needed:
> LD_LIBRARY_PATH=target/debug/ ./simple您可以通過每晚的Rust在本地運行基準:
> cargo bench如果您感謝我的工作並想支持我,則可以與Github贊助商或Patreon一起做。