sysinfo هو قفص يستخدم للحصول على معلومات النظام.
وهو يدعم حاليًا الأنظمة التالية (مرتبة أبجديًا):
لا يزال بإمكانك استخدام 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 المكافئة. على سبيل المثال ، لاستخدام وحدة المعالجة المركزية:
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 in Cargo.toml (الذي يعطل ميزة الشحن multithread ).
في معظم الوقت ، لا تريد جميع المعلومات التي تقدمها sysinfo ولكن مجرد مجموعة فرعية منه. في هذه الحالة ، يوصى باستخدام أساليب refresh_specifics(...) مع ما تحتاجه فقط للحصول على أداء أفضل بكثير.
مشكلات أخرى مواجهة بشكل متكرر: ما لم تكن تعرف ما تفعله ، فمن الأفضل تقريبًا إنشاء هيكل System مرة واحدة واستخدم هذا المثيل من خلال البرنامج. والسبب هو أن الكثير من المعلومات تحتاج إلى قياس سابق ليتم حسابه (استخدام وحدة المعالجة المركزية على سبيل المثال). مثال آخر على سبب كونه أفضل بكثير: في حالة رغبتك في إدراج جميع عمليات التشغيل ، يحتاج sysinfo إلى تخصيص جميع الذاكرة لقائمة بنية Process ، والتي تستغرق بعض الوقت في المدى الأول.
إذا كان برنامجك يحتاج إلى استخدام الكثير من واصفات الملفات ، فمن الأفضل استخدامه:
sysinfo :: set_open_files_limit ( 0 ) ; نظرًا لأن sysinfo يحتفظ بعدد من واصفات الملفات مفتوحة للحصول على أداء أفضل على بعض الأهداف عند تحديث العمليات.
سيكون من الصعب البناء على Raspberry Pi. هناك طريقة جيدة هي أن ترسل البناء ، ثم إرسال القابل للتنفيذ إلى Raspberry 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 أو /sys/class/thermal . على هذا النحو ، قد لا يؤدي الاستعلام عن المكونات إلى إرجاع أي نتائج (أو نتائج غير متوقعة) عند استخدام هذه المكتبة على الأنظمة الافتراضية.
لدى Apple قيود على أي واجهات برمجة التطبيقات التي يمكن ربطها بالثنائيات التي يتم توزيعها من خلال متجر التطبيقات. بشكل افتراضي ، لا يتوافق sysinfo مع هذه القيود. يمكنك استخدام علامة ميزة apple-app-store لتعطيل ميزات Apple المحظورة. يتيح هذا أيضًا ميزة apple-sandbox . في حالة التطبيقات التي تستخدم صندوق الرمل خارج متجر التطبيقات ، يمكن استخدام ميزة apple-sandbox بمفردها لتجنب التسبب في انتهاكات السياسة في وقت التشغيل.
لقد كتبت منشورًا في المدونة يمكنك العثور عليه هنا والذي يشرح كيف يستخلص sysinfo معلومات عن الأنظمة المختلفة.
من الممكن استخدام هذا الصندوق مباشرة من C. ألقِ نظرة على Makefile وملف examples/simple.c .
لبناء مثال C ، فقط قم بتشغيل:
> make
> ./simple
# If needed:
> LD_LIBRARY_PATH=target/debug/ ./simpleيمكنك تشغيل المعايير محليا مع الصدأ ليلا من خلال القيام:
> cargo benchإذا كنت تقدر عملي وترغب في دعمني ، فيمكنك القيام بذلك مع رعاة Github أو مع Patreon.