sysinfo เป็นลังที่ใช้เพื่อรับข้อมูลของระบบ
ปัจจุบันรองรับ OSE ต่อไปนี้ (จัดเรียงตามตัวอักษร):
คุณยังสามารถใช้ sysinfo กับ OSE ที่ไม่ได้รับการสนับสนุนมันจะไม่ทำอะไรเลยและกลับค่าที่ว่างเปล่าเสมอ คุณสามารถตรวจสอบในโปรแกรมของคุณโดยตรงหากระบบปฏิบัติการได้รับการสนับสนุนโดยตรวจสอบค่าคงที่ [ 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) พฤติกรรมสามารถปิดการใช้งานได้โดยการตั้งค่า default-features = false ใน Cargo.toml (ซึ่งปิดใช้งานคุณสมบัติ multithread cargo)
ส่วนใหญ่คุณไม่ต้องการข้อมูลทั้งหมดที่ได้รับจาก sysinfo แต่เป็นเพียงส่วนย่อยของมัน ในกรณีนี้ขอแนะนำให้ใช้วิธีการ refresh_specifics(...) ด้วยสิ่งที่คุณต้องการเพื่อให้มีประสิทธิภาพที่ดีขึ้นมาก
ปัญหาอื่นที่พบบ่อย: เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่มันเกือบตลอดเวลาที่ดีกว่าในการสร้างอินสแตนซ์ของ System โครงสร้างหนึ่งครั้งและใช้อินสแตนซ์นี้ผ่านโปรแกรมของคุณ เหตุผลเป็นเพราะข้อมูลจำนวนมากต้องการมาตรการก่อนหน้านี้ที่จะคำนวณ (ตัวอย่างการใช้งาน CPU) อีกตัวอย่างหนึ่งว่าทำไมมันจึงดีกว่ามาก: ในกรณีที่คุณต้องการแสดงรายการกระบวนการที่กำลังทำงานทั้งหมด sysinfo จำเป็นต้องจัดสรรหน่วยความจำทั้งหมดสำหรับรายการโครงสร้าง Process ซึ่งใช้เวลาพอสมควรในการวิ่งครั้งแรก
หากโปรแกรมของคุณต้องการใช้ตัวอธิบายไฟล์จำนวนมากคุณควรใช้:
sysinfo :: set_open_files_limit ( 0 ) ; ในขณะที่ sysinfo ทำให้ตัวบ่งชี้ไฟล์จำนวนหนึ่งเปิดขึ้นเพื่อให้มีประสิทธิภาพที่ดีขึ้นสำหรับเป้าหมายบางอย่างเมื่อกระบวนการรีเฟรช
มันจะยากที่จะสร้างบน Raspberry Pi วิธีที่ดีคือการข้ามการสร้างจากนั้นส่งปฏิบัติการไปยังราสเบอร์รี่ Pi ของคุณ
ก่อนอื่นติดตั้ง arm toolchain ตัวอย่างเช่นบน 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ในที่สุด Cross Compile:
rustup target add armv7-unknown-linux-gnueabihf
cargo build --target=armv7-unknown-linux-gnueabihf ระบบเสมือนจริงเช่นระบบย่อย Docker และ Windows สำหรับ Linux (WSL) ไม่ได้รับข้อมูลฮาร์ดแวร์โฮสต์ผ่าน /sys/class/hwmon หรือ /sys/class/thermal ดังนั้นการสอบถามสำหรับส่วนประกอบอาจส่งคืนผลลัพธ์ (หรือผลลัพธ์ที่ไม่คาดคิด) เมื่อใช้ไลบรารีนี้ในระบบเสมือนจริง
Apple มีข้อ จำกัด ว่า API ใดสามารถเชื่อมโยงกับไบนารีที่แจกจ่ายผ่าน App Store โดยค่าเริ่มต้น sysinfo ไม่สามารถใช้งานได้กับข้อ จำกัด เหล่านี้ คุณสามารถใช้ธงฟีเจอร์ apple-app-store เพื่อปิดใช้งานคุณสมบัติที่ต้องห้ามของ Apple นอกจากนี้ยังช่วยให้คุณสมบัติ apple-sandbox ในกรณีของแอปพลิเคชันที่ใช้ Sandbox นอกแอพสโตร์คุณลักษณะของ apple-sandbox สามารถใช้งานได้เพียงอย่างเดียวเพื่อหลีกเลี่ยงการละเมิดนโยบายในเวลาทำงาน
ฉันเขียนโพสต์บล็อกที่คุณสามารถหาได้ที่นี่ซึ่งอธิบายว่า sysinfo ดึงข้อมูลเกี่ยวกับระบบต่าง ๆ ได้อย่างไร
เป็นไปได้ที่จะใช้ลังนี้โดยตรงจาก C. ดูที่ Makefile และที่ examples/simple.c ไฟล์
ในการสร้างตัวอย่าง C เพียงเรียกใช้:
> make
> ./simple
# If needed:
> LD_LIBRARY_PATH=target/debug/ ./simpleคุณสามารถเรียกใช้เกณฑ์มาตรฐานในพื้นที่ด้วยสนิม ทุกคืน โดยทำ:
> cargo benchหากคุณชื่นชมงานของฉันและต้องการสนับสนุนฉันคุณสามารถทำได้กับผู้สนับสนุน GitHub หรือกับ Patreon