sysinfo ist eine Kiste, mit der die Informationen eines Systems erhalten werden.
Derzeit unterstützt es die folgenden OSS (alphabetisch sortiert):
Sie können sysinfo immer noch auf nicht unterstützten Osen verwenden, es wird einfach nichts tun und immer leere Werte zurückgeben. Sie können Ihr Programm direkt einchecken, wenn ein Betriebssystem unterstützt wird, indem Sie die Konstante [ IS_SUPPORTED_SYSTEM ] überprüfen.
Die minimal unterstützte Version von rustc beträgt 1,74 .
Wenn Sie von einer älteren Version migrieren möchten, zögern Sie nicht, sich den ChangeLog und den Migrationsführer anzusehen.
Aus diesem Grund ist es viel besser, die gleiche Instanz von [ System ] zu behalten, anstatt es mehrmals nachzubilden.
Sie haben ein Beispiel im examples -Ordner. Sie können es mit cargo run --example simple .
Ansonsten ist hier ein kleines Code -Beispiel:
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:?}" ) ;
} Bitte denken Sie daran, dass Sie die gleichwertige refresh aufrufen müssen, um einige aktuelle Informationen zu erhalten. Zum Beispiel für die CPU -Verwendung:
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 ) ;
} Standardmäßig verwendet sysinfo mehrere Threads. Dies kann jedoch die Speicherverwendung auf einigen Plattformen erhöhen (z. B. macOS). Das Verhalten kann deaktiviert werden, indem default-features = false in Cargo.toml festgelegt werden (was die multithread -Frachtfunktion deaktiviert).
Meistens möchten Sie nicht alle Informationen, die von sysinfo bereitgestellt werden, sondern nur eine Teilmenge davon. In diesem Fall wird empfohlen, die Methoden von refresh_specifics(...) mit nur dem zu verwenden, was Sie benötigen, um eine viel bessere Leistung zu erzielen.
Ein weiterer häufig auftretender Probleme, das häufig auftrat: Wenn Sie nicht wissen, was Sie tun, ist es fast immer besser, die System einmal zu instanziieren und diese eine Instanz über Ihr Programm zu verwenden. Der Grund dafür ist, dass viele Informationen eine frühere Maßnahme benötigen, um berechnet zu werden (z. B. die CPU -Verwendung). Ein weiteres Beispiel, warum es viel besser ist: Falls Sie alle laufenden Prozesse auflisten möchten, muss sysinfo den gesamten Speicher für die Process zuweisen, die beim ersten Lauf einige Zeit dauert.
Wenn Ihr Programm eine Menge Dateideskriptoren verwenden muss, sollten Sie besser verwenden:
sysinfo :: set_open_files_limit ( 0 ) ; Da sysinfo eine Reihe von Dateideskriptoren offen hält, um bei einigen Zielen eine bessere Leistung bei Aktualisieren von Prozessen zu erhalten.
Es wird schwierig sein, auf Raspberry Pi aufzubauen. Ein guter Weg ist, um zu bauen und dann die ausführbare Datei an Ihren Raspberry Pi zu senden.
Installieren Sie zuerst die ARM Toolchain, zum Beispiel auf Ubuntu:
> sudo apt-get install gcc-multilib-arm-linux-gnueabihfKonfigurieren Sie dann Fracht, um die entsprechende Toolchain zu verwenden:
cat << EOF > ~/.cargo/config
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
EOFSchließlich Cross Compile:
rustup target add armv7-unknown-linux-gnueabihf
cargo build --target=armv7-unknown-linux-gnueabihf Virtuelle Linux -Systeme, wie diejenigen, die durch Docker und Windows Subsystem für Linux (WSL) ausgeführt werden, erhalten keine Host -Hardware -Informationen über /sys/class/hwmon oder /sys/class/thermal . Daher können die Abfragen für Komponenten bei der Verwendung dieser Bibliothek auf virtuellen Systemen keine Ergebnisse (oder unerwartete Ergebnisse) zurückgeben.
Apple hat Einschränkungen, welche APIs mit Binärdateien in Verbindung gebracht werden können, die über den App Store verteilt werden. Standardmäßig ist sysinfo nicht mit diesen Einschränkungen kompatibel. Sie können das apple-app-store -Funktionsflag verwenden, um die von Apple verbotenen Funktionen zu deaktivieren. Dies ermöglicht auch die apple-sandbox -Funktion. Bei Anwendungen, die die Sandbox außerhalb des App Store verwenden, kann die apple-sandbox -Funktion allein verwendet werden, um zu vermeiden, dass Verstöße gegen die Richtlinien zur Laufzeit verursacht werden.
Ich habe einen Blog -Beitrag geschrieben, den Sie hier finden können, in dem erklärt wird, wie sysinfo Informationen zu den verschiedenen Systemen extrahiert.
Es ist möglich, diese Kiste direkt von C zu verwenden. Schauen Sie sich die Makefile und die examples/simple.c -Datei an.
Um das C -Beispiel zu erstellen, rennen Sie einfach:
> make
> ./simple
# If needed:
> LD_LIBRARY_PATH=target/debug/ ./simpleSie können die Benchmarks lokal mit Rost abends durchführen, indem Sie:
> cargo benchWenn Sie meine Arbeit schätzen und mich unterstützen möchten, können Sie dies mit Github -Sponsoren oder mit Patreon tun.