sysinfo 、システムの情報を取得するために使用される木枠です。
現在、次のOSをサポートしています(アルファベット順にソートされています):
サポートされていないOSでsysinfoを使用することもできますが、それは単に何もしないで、常に空の値を返します。 [ IS_SUPPORTED_SYSTEM ]定数をチェックすることにより、OSがサポートされている場合は、プログラムを直接確認できます。
rustcの最小サポートバージョンは1.74です。
古いバージョンから移行したい場合は、ChangelogとMigration Guideをご覧ください。
そのため、[ 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)のメモリ使用量が増加する可能性があります。動作は、 Cargo.tomlでdefault-features = falseを設定することで無効にできます( multithread貨物機能を無効にします)。
ほとんどの場合、 sysinfoが提供するすべての情報が必要ではなく、そのサブセットだけが必要です。この場合、 refresh_specifics(...)メソッドを使用することをお勧めします。
頻繁に遭遇する別の問題:自分が何をしているのかわからない限り、 System構造体を一度インスタンス化し、プログラムを通じてこのインスタンスを使用する方がほぼ常に良いです。その理由は、多くの情報が計算するために以前の測定値を必要とするためです(たとえば、CPU使用)。もう1つの例は、すべての実行中のプロセスをリストしたい場合に備えて、 sysinfo Process構造リストにすべてのメモリを割り当てる必要があります。これには、最初の実行にかなりの時間がかかります。
プログラムが多くのファイル記述子を使用する必要がある場合は、使用する方が良いでしょう。
sysinfo :: set_open_files_limit ( 0 ) ; sysinfo多くのファイル記述子を開いており、プロセスを更新するときにいくつかのターゲットでより良いパフォーマンスを発揮するようにしています。
Raspberry Piに基づいて構築することは困難です。良い方法は、クロスビルドしてから、実行可能ファイルをRaspberry Piに送信することです。
まず、UbuntuでARMツールチェーンをインストールします。
> 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(WSL)用のDockerおよびWindowsサブシステムを介して実行されるような仮想Linuxシステムは、 /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でそれを行うことができます。