Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/GuillaumeGomez/sysinfo
Cross-platform library to fetch system information
https://github.com/GuillaumeGomez/sysinfo
linux macos raspberry rust system unix windows
Last synced: 2 months ago
JSON representation
Cross-platform library to fetch system information
- Host: GitHub
- URL: https://github.com/GuillaumeGomez/sysinfo
- Owner: GuillaumeGomez
- License: mit
- Created: 2015-03-10T22:54:41.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2024-07-31T13:44:52.000Z (5 months ago)
- Last Synced: 2024-07-31T23:01:06.055Z (5 months ago)
- Topics: linux, macos, raspberry, rust, system, unix, windows
- Language: Rust
- Homepage:
- Size: 2.83 MB
- Stars: 1,963
- Watchers: 15
- Forks: 295
- Open Issues: 62
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
- awesome-rust - GuillaumeGomez/sysinfo - platform library to fetch system information [![build badge](https://github.com/GuillaumeGomez/sysinfo/actions/workflows/CI.yml/badge.svg?branch=master)](https://github.com/GuillaumeGomez/sysinfo/actions/workflows/CI.yml) (Libraries / System)
README
# sysinfo [![][img_crates]][crates] [![][img_doc]][doc]
`sysinfo` is a crate used to get a system's information.
## Supported OSes
It currently supports the following OSes (alphabetically sorted):
* Android
* FreeBSD
* iOS
* Linux
* macOS
* Raspberry Pi
* WindowsYou can still use `sysinfo` on non-supported OSes, it'll simply do nothing and always return
empty values. You can check in your program directly if an OS is supported by checking the
[`IS_SUPPORTED_SYSTEM`] constant.The minimum-supported version of `rustc` is **1.74**.
## Usage
If you want to migrate from an older version, don't hesitate to take a look at the
[CHANGELOG](https://github.com/GuillaumeGomez/sysinfo/blob/master/CHANGELOG.md) and at the
[migration guide](https://github.com/GuillaumeGomez/sysinfo/blob/master/migration_guide.md).⚠️ Before any attempt to read the different structs' information, you need to update them to
get up-to-date information because for most of them, it works on diff between the current value
and the old one.Which is why, it's much better to keep the same instance of [`System`] around instead of
recreating it multiple times.You have an example into the `examples` folder. You can run it with `cargo run --example simple`.
Otherwise, here is a little code sample:
```rust
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:?}");
}
```Please remember that to have some up-to-date information, you need to call the equivalent
`refresh` method. For example, for the CPU usage:```rust,no_run
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);
}
```By default, `sysinfo` uses multiple threads. However, this can increase the memory usage on some
platforms (macOS for example). The behavior can be disabled by setting `default-features = false`
in `Cargo.toml` (which disables the `multithread` cargo feature).### Good practice / Performance tips
Most of the time, you don't want all information provided by `sysinfo` but just a subset of it.
In this case, it's recommended to use `refresh_specifics(...)` methods with only what you need
to have much better performance.Another issues frequently encountered: unless you know what you're doing, it's almost all the
time better to instantiate the `System` struct once and use this one instance through your
program. The reason is because a lot of information needs a previous measure to be computed
(the CPU usage for example). Another example why it's much better: in case you want to list
all running processes, `sysinfo` needs to allocate all memory for the `Process` struct list,
which takes quite some time on the first run.If your program needs to use a lot of file descriptors, you'd better use:
```rust,no_run
sysinfo::set_open_files_limit(0);
```as `sysinfo` keeps a number of file descriptors open to have better performance on some
targets when refreshing processes.### Running on Raspberry Pi
It'll be difficult to build on Raspberry Pi. A good way-around is to cross-build, then send the
executable to your Raspberry Pi.First install the arm toolchain, for example on Ubuntu:
```bash
> sudo apt-get install gcc-multilib-arm-linux-gnueabihf
```Then configure cargo to use the corresponding toolchain:
```bash
cat << EOF > ~/.cargo/config
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
EOF
```Finally, cross compile:
```bash
rustup target add armv7-unknown-linux-gnueabihf
cargo build --target=armv7-unknown-linux-gnueabihf
```### Linux on Docker & Windows Subsystem for Linux (WSL)
Virtual Linux systems, such as those run through Docker and Windows Subsystem for Linux (WSL), do
not receive host hardware information via `/sys/class/hwmon` or `/sys/class/thermal`. As such,
querying for components may return no results (or unexpected results) when using this library on
virtual systems.### Use in binaries running inside the macOS or iOS Sandbox/stores
Apple has restrictions as to which APIs can be linked into binaries that are distributed through the app store.
By default, `sysinfo` is not compatible with these restrictions. You can use the `apple-app-store`
feature flag to disable the Apple prohibited features. This also enables the `apple-sandbox` feature.
In the case of applications using the sandbox outside of the app store, the `apple-sandbox` feature
can be used alone to avoid causing policy violations at runtime.### How it works
I wrote a blog post you can find [here][sysinfo-blog] which explains how `sysinfo` extracts information
on the different systems.[sysinfo-blog]: https://blog.guillaume-gomez.fr/articles/2021-09-06+sysinfo%3A+how+to+extract+systems%27+information
### C interface
It's possible to use this crate directly from C. Take a look at the `Makefile` and at the
`examples/simple.c` file.To build the C example, just run:
```bash
> make
> ./simple
# If needed:
> LD_LIBRARY_PATH=target/debug/ ./simple
```### Benchmarks
You can run the benchmarks locally with rust **nightly** by doing:
```bash
> cargo bench
```## Donations
If you appreciate my work and want to support me, you can do it with
[github sponsors](https://github.com/sponsors/GuillaumeGomez) or with
[patreon](https://www.patreon.com/GuillaumeGomez).[img_crates]: https://img.shields.io/crates/v/sysinfo.svg
[img_doc]: https://img.shields.io/badge/rust-documentation-blue.svg[crates]: https://crates.io/crates/sysinfo
[doc]: https://docs.rs/sysinfo/