sysinfo adalah peti yang digunakan untuk mendapatkan informasi sistem.
Saat ini mendukung OS berikut (diurutkan secara abjad):
Anda masih dapat menggunakan sysinfo pada OS yang tidak didukung, itu tidak akan melakukan apa pun dan selalu mengembalikan nilai kosong. Anda dapat memeriksa program Anda secara langsung jika OS didukung dengan memeriksa konstanta [ IS_SUPPORTED_SYSTEM ].
Versi rustc yang didukung minimum adalah 1,74 .
Jika Anda ingin bermigrasi dari versi yang lebih lama, jangan ragu untuk melihat changelog dan panduan migrasi.
Itulah sebabnya, jauh lebih baik untuk menjaga contoh [ System ] yang sama daripada menciptakannya beberapa kali.
Anda memiliki contoh ke folder examples . Anda dapat menjalankannya dengan cargo run --example simple .
Kalau tidak, berikut adalah sampel kode kecil:
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:?}" ) ;
} Harap ingat bahwa untuk memiliki beberapa informasi terkini, Anda perlu menghubungi metode refresh yang setara. Misalnya, untuk penggunaan 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 ) ;
} Secara default, sysinfo menggunakan beberapa utas. Namun, ini dapat meningkatkan penggunaan memori pada beberapa platform (misalnya macO). Perilaku dapat dinonaktifkan dengan mengatur default-features = false in Cargo.toml (yang menonaktifkan fitur kargo multithread ).
Sebagian besar waktu, Anda tidak ingin semua informasi yang disediakan oleh sysinfo tetapi hanya sebagian dari itu. Dalam hal ini, disarankan untuk menggunakan metode refresh_specifics(...) dengan hanya apa yang Anda butuhkan untuk memiliki kinerja yang jauh lebih baik.
Masalah lain yang sering ditemui: Kecuali jika Anda tahu apa yang Anda lakukan, hampir semua waktu lebih baik untuk instantiate System struct sekali dan menggunakan satu contoh ini melalui program Anda. Alasannya adalah karena banyak informasi membutuhkan tindakan sebelumnya untuk dihitung (penggunaan CPU misalnya). Contoh lain mengapa jauh lebih baik: jika Anda ingin mencantumkan semua proses berjalan, sysinfo perlu mengalokasikan semua memori untuk daftar struct Process , yang membutuhkan waktu cukup banyak pada menjalankan pertama.
Jika program Anda perlu menggunakan banyak deskriptor file, Anda sebaiknya menggunakan:
sysinfo :: set_open_files_limit ( 0 ) ; Karena sysinfo membuat sejumlah deskriptor file terbuka untuk memiliki kinerja yang lebih baik pada beberapa target saat proses menyegarkan.
Akan sulit untuk membangun di Raspberry Pi. Jalan yang baik adalah untuk membangun silang, lalu mengirim yang dapat dieksekusi ke raspberry pi Anda.
Pertama instal Toolchain ARM, misalnya di Ubuntu:
> sudo apt-get install gcc-multilib-arm-linux-gnueabihfKemudian konfigurasikan kargo untuk menggunakan toolchain yang sesuai:
cat << EOF > ~/.cargo/config
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
EOFAkhirnya, Cross Compile:
rustup target add armv7-unknown-linux-gnueabihf
cargo build --target=armv7-unknown-linux-gnueabihf Sistem Linux virtual, seperti yang dijalankan melalui subsistem Docker dan Windows untuk Linux (WSL), tidak menerima informasi perangkat keras host melalui /sys/class/hwmon atau /sys/class/thermal . Dengan demikian, permintaan untuk komponen tidak dapat mengembalikan hasil (atau hasil yang tidak terduga) saat menggunakan pustaka ini pada sistem virtual.
Apple memiliki batasan tentang API mana yang dapat dihubungkan ke binari yang didistribusikan melalui App Store. Secara default, sysinfo tidak kompatibel dengan pembatasan ini. Anda dapat menggunakan bendera fitur apple-app-store untuk menonaktifkan fitur yang dilarang Apple. Ini juga memungkinkan fitur apple-sandbox . Dalam hal aplikasi menggunakan kotak pasir di luar App Store, fitur apple-sandbox dapat digunakan sendiri untuk menghindari menyebabkan pelanggaran kebijakan saat runtime.
Saya menulis posting blog yang dapat Anda temukan di sini yang menjelaskan bagaimana sysinfo mengekstrak informasi tentang sistem yang berbeda.
Dimungkinkan untuk menggunakan peti ini langsung dari C. Lihatlah Makefile dan pada examples/simple.c .
Untuk membangun contoh C, jalankan saja:
> make
> ./simple
# If needed:
> LD_LIBRARY_PATH=target/debug/ ./simpleAnda dapat menjalankan tolok ukur secara lokal dengan karat malam dengan melakukan:
> cargo benchJika Anda menghargai pekerjaan saya dan ingin mendukung saya, Anda dapat melakukannya dengan sponsor GitHub atau dengan Patreon.