sysinfo - это ящик, используемый для получения информации системы.
В настоящее время он поддерживает следующие OSES (алфавитно отсортирован):
Вы по-прежнему можете использовать sysinfo на OSES, не поддерживаемые OSES, он просто ничего не сделает и всегда будет возвращать пустые значения. Вы можете проверить свою программу напрямую, если ОС поддерживается путем проверки постоянной [ 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 . Например, для использования процессора:
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 груза).
В большинстве случаев вам не нужна вся информация, предоставленная sysinfo , а просто подмножество. В этом случае рекомендуется использовать методы refresh_specifics(...) только с тем, что вам нужно, чтобы иметь гораздо лучшую производительность.
Другие проблемы часто сталкивались: если вы не знаете, что делаете, почти все время лучше создать System структуру один раз и использовать этот экземпляр в своей программе. Причина в том, что большая часть информации требует предыдущей меры, которая будет рассчитана (например, использование ЦП). Другой пример, почему это намного лучше: если вы хотите перечислить все запуска процессов, sysinfo необходимо выделить всю память для списка структур Process , который занимает довольно много времени при первом заезде.
Если вашей программе нужно использовать много дескрипторов файлов, вам лучше использовать:
sysinfo :: set_open_files_limit ( 0 ) ; Поскольку sysinfo держит ряд файловых дескрипторов открытыми, чтобы иметь лучшую производительность в некоторых целях в процессах освежения.
Будет сложно построить на 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Наконец, Cross Compile:
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 есть ограничения относительно того, какие API могут быть связаны с двоичными файлами, которые распространяются через App Store. По умолчанию sysinfo не совместима с этими ограничениями. Вы можете использовать флаг функции apple-app-store , чтобы отключить запрещенные функции Apple. Это также позволяет apple-sandbox функции. В случае приложений, использующих песочницу за пределами App Store, функция apple-sandbox может использоваться в одиночку, чтобы избежать нарушений политики во время выполнения.
Я написал сообщение в блоге, которое вы можете найти здесь, в котором объясняется, как sysinfo извлекает информацию в различные системы.
Можно использовать этот ящик непосредственно из C. Взгляните на файл Makefile и в examples/simple.c .
Чтобы построить пример C, просто запустите:
> make
> ./simple
# If needed:
> LD_LIBRARY_PATH=target/debug/ ./simpleВы можете запустить тесты локально с ржавчиной ночью, делая:
> cargo benchЕсли вы цените мою работу и хотите поддержать меня, вы можете сделать это со спонсорами GitHub или с Patreon.