Struct User

Source
pub struct User { /* private fields */ }
Expand description

Type containing user information.

It is returned by Users.

use sysinfo::Users;

let users = Users::new_with_refreshed_list();
for user in users.list() {
    println!("{:?}", user);
}

Implementations§

Source§

impl User

Source

pub fn id(&self) -> &Uid

Returns the ID of the user.

use sysinfo::Users;

let users = Users::new_with_refreshed_list();
for user in users.list() {
    println!("{:?}", *user.id());
}
Source

pub fn group_id(&self) -> Gid

Returns the group ID of the user.

⚠️ This information is not set on Windows. Windows doesn’t have a username specific group assigned to the user. They do however have unique Security Identifiers made up of various Components. Pieces of the SID may be a candidate for this field, but it doesn’t map well to a single group ID.

use sysinfo::Users;

let users = Users::new_with_refreshed_list();
for user in users.list() {
    println!("{}", *user.group_id());
}
Source

pub fn name(&self) -> &str

Returns the name of the user.

use sysinfo::Users;

let users = Users::new_with_refreshed_list();
for user in users.list() {
    println!("{}", user.name());
}
Examples found in repository?
examples/simple.rs (line 257)
65fn interpret_input(
66    input: &str,
67    sys: &mut System,
68    networks: &mut Networks,
69    disks: &mut Disks,
70    components: &mut Components,
71    users: &mut Users,
72) -> bool {
73    match input.trim() {
74        "help" => print_help(),
75        "refresh_disks" => {
76            println!("Refreshing disk list...");
77            disks.refresh(true);
78            println!("Done.");
79        }
80        "refresh_users" => {
81            println!("Refreshing user list...");
82            users.refresh();
83            println!("Done.");
84        }
85        "refresh_networks" => {
86            println!("Refreshing network list...");
87            networks.refresh(true);
88            println!("Done.");
89        }
90        "refresh_components" => {
91            println!("Refreshing component list...");
92            components.refresh(true);
93            println!("Done.");
94        }
95        "refresh_cpu" => {
96            println!("Refreshing CPUs...");
97            sys.refresh_cpu_all();
98            println!("Done.");
99        }
100        "signals" => {
101            for (nb, sig) in SUPPORTED_SIGNALS.iter().enumerate() {
102                println!("{:2}:{sig:?}", nb + 1);
103            }
104        }
105        "cpus" => {
106            // Note: you should refresh a few times before using this, so that usage statistics
107            // can be ascertained
108            println!(
109                "number of physical cores: {}",
110                System::physical_core_count()
111                    .map(|c| c.to_string())
112                    .unwrap_or_else(|| "Unknown".to_owned()),
113            );
114            println!("total CPU usage: {}%", sys.global_cpu_usage(),);
115            for cpu in sys.cpus() {
116                println!("{cpu:?}");
117            }
118        }
119        "memory" => {
120            println!("total memory:     {: >10} KB", sys.total_memory() / 1_000);
121            println!(
122                "available memory: {: >10} KB",
123                sys.available_memory() / 1_000
124            );
125            println!("used memory:      {: >10} KB", sys.used_memory() / 1_000);
126            println!("total swap:       {: >10} KB", sys.total_swap() / 1_000);
127            println!("used swap:        {: >10} KB", sys.used_swap() / 1_000);
128        }
129        "quit" | "exit" => return true,
130        "all" => {
131            for (pid, proc_) in sys.processes() {
132                println!(
133                    "{}:{} status={:?}",
134                    pid,
135                    proc_.name().to_string_lossy(),
136                    proc_.status()
137                );
138            }
139        }
140        "frequency" => {
141            for cpu in sys.cpus() {
142                println!("[{}] {} MHz", cpu.name(), cpu.frequency(),);
143            }
144        }
145        "vendor_id" => {
146            println!("vendor ID: {}", sys.cpus()[0].vendor_id());
147        }
148        "brand" => {
149            println!("brand: {}", sys.cpus()[0].brand());
150        }
151        "load_avg" => {
152            let load_avg = System::load_average();
153            println!("one minute     : {}%", load_avg.one);
154            println!("five minutes   : {}%", load_avg.five);
155            println!("fifteen minutes: {}%", load_avg.fifteen);
156        }
157        e if e.starts_with("show ") => {
158            let tmp: Vec<&str> = e.split(' ').filter(|s| !s.is_empty()).collect();
159
160            if tmp.len() != 2 {
161                println!("show command takes a pid or a name in parameter!");
162                println!("example: show 1254");
163            } else if let Ok(pid) = Pid::from_str(tmp[1]) {
164                match sys.process(pid) {
165                    Some(p) => {
166                        println!("{:?}", *p);
167                        println!(
168                            "Files open/limit: {:?}/{:?}",
169                            p.open_files(),
170                            p.open_files_limit(),
171                        );
172                    }
173                    None => {
174                        println!("pid \"{pid:?}\" not found");
175                    }
176                }
177            } else {
178                let proc_name = tmp[1];
179                for proc_ in sys.processes_by_name(proc_name.as_ref()) {
180                    println!("==== {} ====", proc_.name().to_string_lossy());
181                    println!("{proc_:?}");
182                }
183            }
184        }
185        "temperature" => {
186            for component in components.iter() {
187                println!("{component:?}");
188            }
189        }
190        "network" => {
191            for (interface_name, data) in networks.iter() {
192                println!(
193                    "\
194{interface_name}:
195  ether {}
196  input data  (new / total): {} / {} B
197  output data (new / total): {} / {} B",
198                    data.mac_address(),
199                    data.received(),
200                    data.total_received(),
201                    data.transmitted(),
202                    data.total_transmitted(),
203                );
204            }
205        }
206        "show" => {
207            println!("'show' command expects a pid number or a process name");
208        }
209        e if e.starts_with("kill ") => {
210            let tmp: Vec<&str> = e
211                .split(' ')
212                .map(|s| s.trim())
213                .filter(|s| !s.is_empty())
214                .collect();
215
216            if tmp.len() != 3 {
217                println!("kill command takes the pid and a signal number in parameter!");
218                println!("example: kill 1254 9");
219            } else {
220                let Ok(pid) = Pid::from_str(tmp[1]) else {
221                    eprintln!("Expected a number for the PID, found {:?}", tmp[1]);
222                    return false;
223                };
224                let Ok(signal) = usize::from_str(tmp[2]) else {
225                    eprintln!("Expected a number for the signal, found {:?}", tmp[2]);
226                    return false;
227                };
228                let Some(signal) = SUPPORTED_SIGNALS.get(signal) else {
229                    eprintln!(
230                        "No signal matching {signal}. Use the `signals` command to get the \
231                         list of signals.",
232                    );
233                    return false;
234                };
235
236                match sys.process(pid) {
237                    Some(p) => {
238                        if let Some(res) = p.kill_with(*signal) {
239                            println!("kill: {res}");
240                        } else {
241                            eprintln!("kill: signal not supported on this platform");
242                        }
243                    }
244                    None => {
245                        eprintln!("pid not found");
246                    }
247                }
248            }
249        }
250        "disks" => {
251            for disk in disks {
252                println!("{disk:?}");
253            }
254        }
255        "users" => {
256            for user in users {
257                println!("{:?} => {:?}", user.name(), user.groups(),);
258            }
259        }
260        "groups" => {
261            for group in Groups::new_with_refreshed_list().list() {
262                println!("{group:?}");
263            }
264        }
265        "boot_time" => {
266            println!("{} seconds", System::boot_time());
267        }
268        "uptime" => {
269            let up = System::uptime();
270            let mut uptime = up;
271            let days = uptime / 86400;
272            uptime -= days * 86400;
273            let hours = uptime / 3600;
274            uptime -= hours * 3600;
275            let minutes = uptime / 60;
276            println!("{days} days {hours} hours {minutes} minutes ({up} seconds in total)",);
277        }
278        x if x.starts_with("refresh") => {
279            if x == "refresh" {
280                println!("Getting processes' information...");
281                sys.refresh_all();
282                println!("Done.");
283            } else if x.starts_with("refresh ") {
284                println!("Getting process' information...");
285                if let Some(pid) = x
286                    .split(' ')
287                    .filter_map(|pid| pid.parse().ok())
288                    .take(1)
289                    .next()
290                {
291                    if sys.refresh_processes(sysinfo::ProcessesToUpdate::Some(&[pid]), true) != 0 {
292                        println!("Process `{pid}` updated successfully");
293                    } else {
294                        println!("Process `{pid}` couldn't be updated...");
295                    }
296                } else {
297                    println!("Invalid [pid] received...");
298                }
299            } else {
300                println!(
301                    "\"{x}\": Unknown command. Enter 'help' if you want to get the commands' \
302                     list.",
303                );
304            }
305        }
306        "pid" => {
307            println!(
308                "PID: {}",
309                sysinfo::get_current_pid().expect("failed to get PID")
310            );
311        }
312        "system" => {
313            println!(
314                "System name:              {}\n\
315                 System kernel version:    {}\n\
316                 System OS version:        {}\n\
317                 System OS (long) version: {}\n\
318                 System host name:         {}\n\
319                 System kernel:            {}",
320                System::name().unwrap_or_else(|| "<unknown>".to_owned()),
321                System::kernel_version().unwrap_or_else(|| "<unknown>".to_owned()),
322                System::os_version().unwrap_or_else(|| "<unknown>".to_owned()),
323                System::long_os_version().unwrap_or_else(|| "<unknown>".to_owned()),
324                System::host_name().unwrap_or_else(|| "<unknown>".to_owned()),
325                System::kernel_long_version(),
326            );
327        }
328        e => {
329            println!(
330                "\"{e}\": Unknown command. Enter 'help' if you want to get the commands' \
331                 list.",
332            );
333        }
334    }
335    false
336}
Source

pub fn groups(&self) -> Vec<Group>

Returns the groups of the user.

⚠️ This is computed every time this method is called.

use sysinfo::Users;

let users = Users::new_with_refreshed_list();
for user in users.list() {
    println!("{} is in {:?}", user.name(), user.groups());
}
Examples found in repository?
examples/simple.rs (line 257)
65fn interpret_input(
66    input: &str,
67    sys: &mut System,
68    networks: &mut Networks,
69    disks: &mut Disks,
70    components: &mut Components,
71    users: &mut Users,
72) -> bool {
73    match input.trim() {
74        "help" => print_help(),
75        "refresh_disks" => {
76            println!("Refreshing disk list...");
77            disks.refresh(true);
78            println!("Done.");
79        }
80        "refresh_users" => {
81            println!("Refreshing user list...");
82            users.refresh();
83            println!("Done.");
84        }
85        "refresh_networks" => {
86            println!("Refreshing network list...");
87            networks.refresh(true);
88            println!("Done.");
89        }
90        "refresh_components" => {
91            println!("Refreshing component list...");
92            components.refresh(true);
93            println!("Done.");
94        }
95        "refresh_cpu" => {
96            println!("Refreshing CPUs...");
97            sys.refresh_cpu_all();
98            println!("Done.");
99        }
100        "signals" => {
101            for (nb, sig) in SUPPORTED_SIGNALS.iter().enumerate() {
102                println!("{:2}:{sig:?}", nb + 1);
103            }
104        }
105        "cpus" => {
106            // Note: you should refresh a few times before using this, so that usage statistics
107            // can be ascertained
108            println!(
109                "number of physical cores: {}",
110                System::physical_core_count()
111                    .map(|c| c.to_string())
112                    .unwrap_or_else(|| "Unknown".to_owned()),
113            );
114            println!("total CPU usage: {}%", sys.global_cpu_usage(),);
115            for cpu in sys.cpus() {
116                println!("{cpu:?}");
117            }
118        }
119        "memory" => {
120            println!("total memory:     {: >10} KB", sys.total_memory() / 1_000);
121            println!(
122                "available memory: {: >10} KB",
123                sys.available_memory() / 1_000
124            );
125            println!("used memory:      {: >10} KB", sys.used_memory() / 1_000);
126            println!("total swap:       {: >10} KB", sys.total_swap() / 1_000);
127            println!("used swap:        {: >10} KB", sys.used_swap() / 1_000);
128        }
129        "quit" | "exit" => return true,
130        "all" => {
131            for (pid, proc_) in sys.processes() {
132                println!(
133                    "{}:{} status={:?}",
134                    pid,
135                    proc_.name().to_string_lossy(),
136                    proc_.status()
137                );
138            }
139        }
140        "frequency" => {
141            for cpu in sys.cpus() {
142                println!("[{}] {} MHz", cpu.name(), cpu.frequency(),);
143            }
144        }
145        "vendor_id" => {
146            println!("vendor ID: {}", sys.cpus()[0].vendor_id());
147        }
148        "brand" => {
149            println!("brand: {}", sys.cpus()[0].brand());
150        }
151        "load_avg" => {
152            let load_avg = System::load_average();
153            println!("one minute     : {}%", load_avg.one);
154            println!("five minutes   : {}%", load_avg.five);
155            println!("fifteen minutes: {}%", load_avg.fifteen);
156        }
157        e if e.starts_with("show ") => {
158            let tmp: Vec<&str> = e.split(' ').filter(|s| !s.is_empty()).collect();
159
160            if tmp.len() != 2 {
161                println!("show command takes a pid or a name in parameter!");
162                println!("example: show 1254");
163            } else if let Ok(pid) = Pid::from_str(tmp[1]) {
164                match sys.process(pid) {
165                    Some(p) => {
166                        println!("{:?}", *p);
167                        println!(
168                            "Files open/limit: {:?}/{:?}",
169                            p.open_files(),
170                            p.open_files_limit(),
171                        );
172                    }
173                    None => {
174                        println!("pid \"{pid:?}\" not found");
175                    }
176                }
177            } else {
178                let proc_name = tmp[1];
179                for proc_ in sys.processes_by_name(proc_name.as_ref()) {
180                    println!("==== {} ====", proc_.name().to_string_lossy());
181                    println!("{proc_:?}");
182                }
183            }
184        }
185        "temperature" => {
186            for component in components.iter() {
187                println!("{component:?}");
188            }
189        }
190        "network" => {
191            for (interface_name, data) in networks.iter() {
192                println!(
193                    "\
194{interface_name}:
195  ether {}
196  input data  (new / total): {} / {} B
197  output data (new / total): {} / {} B",
198                    data.mac_address(),
199                    data.received(),
200                    data.total_received(),
201                    data.transmitted(),
202                    data.total_transmitted(),
203                );
204            }
205        }
206        "show" => {
207            println!("'show' command expects a pid number or a process name");
208        }
209        e if e.starts_with("kill ") => {
210            let tmp: Vec<&str> = e
211                .split(' ')
212                .map(|s| s.trim())
213                .filter(|s| !s.is_empty())
214                .collect();
215
216            if tmp.len() != 3 {
217                println!("kill command takes the pid and a signal number in parameter!");
218                println!("example: kill 1254 9");
219            } else {
220                let Ok(pid) = Pid::from_str(tmp[1]) else {
221                    eprintln!("Expected a number for the PID, found {:?}", tmp[1]);
222                    return false;
223                };
224                let Ok(signal) = usize::from_str(tmp[2]) else {
225                    eprintln!("Expected a number for the signal, found {:?}", tmp[2]);
226                    return false;
227                };
228                let Some(signal) = SUPPORTED_SIGNALS.get(signal) else {
229                    eprintln!(
230                        "No signal matching {signal}. Use the `signals` command to get the \
231                         list of signals.",
232                    );
233                    return false;
234                };
235
236                match sys.process(pid) {
237                    Some(p) => {
238                        if let Some(res) = p.kill_with(*signal) {
239                            println!("kill: {res}");
240                        } else {
241                            eprintln!("kill: signal not supported on this platform");
242                        }
243                    }
244                    None => {
245                        eprintln!("pid not found");
246                    }
247                }
248            }
249        }
250        "disks" => {
251            for disk in disks {
252                println!("{disk:?}");
253            }
254        }
255        "users" => {
256            for user in users {
257                println!("{:?} => {:?}", user.name(), user.groups(),);
258            }
259        }
260        "groups" => {
261            for group in Groups::new_with_refreshed_list().list() {
262                println!("{group:?}");
263            }
264        }
265        "boot_time" => {
266            println!("{} seconds", System::boot_time());
267        }
268        "uptime" => {
269            let up = System::uptime();
270            let mut uptime = up;
271            let days = uptime / 86400;
272            uptime -= days * 86400;
273            let hours = uptime / 3600;
274            uptime -= hours * 3600;
275            let minutes = uptime / 60;
276            println!("{days} days {hours} hours {minutes} minutes ({up} seconds in total)",);
277        }
278        x if x.starts_with("refresh") => {
279            if x == "refresh" {
280                println!("Getting processes' information...");
281                sys.refresh_all();
282                println!("Done.");
283            } else if x.starts_with("refresh ") {
284                println!("Getting process' information...");
285                if let Some(pid) = x
286                    .split(' ')
287                    .filter_map(|pid| pid.parse().ok())
288                    .take(1)
289                    .next()
290                {
291                    if sys.refresh_processes(sysinfo::ProcessesToUpdate::Some(&[pid]), true) != 0 {
292                        println!("Process `{pid}` updated successfully");
293                    } else {
294                        println!("Process `{pid}` couldn't be updated...");
295                    }
296                } else {
297                    println!("Invalid [pid] received...");
298                }
299            } else {
300                println!(
301                    "\"{x}\": Unknown command. Enter 'help' if you want to get the commands' \
302                     list.",
303                );
304            }
305        }
306        "pid" => {
307            println!(
308                "PID: {}",
309                sysinfo::get_current_pid().expect("failed to get PID")
310            );
311        }
312        "system" => {
313            println!(
314                "System name:              {}\n\
315                 System kernel version:    {}\n\
316                 System OS version:        {}\n\
317                 System OS (long) version: {}\n\
318                 System host name:         {}\n\
319                 System kernel:            {}",
320                System::name().unwrap_or_else(|| "<unknown>".to_owned()),
321                System::kernel_version().unwrap_or_else(|| "<unknown>".to_owned()),
322                System::os_version().unwrap_or_else(|| "<unknown>".to_owned()),
323                System::long_os_version().unwrap_or_else(|| "<unknown>".to_owned()),
324                System::host_name().unwrap_or_else(|| "<unknown>".to_owned()),
325                System::kernel_long_version(),
326            );
327        }
328        e => {
329            println!(
330                "\"{e}\": Unknown command. Enter 'help' if you want to get the commands' \
331                 list.",
332            );
333        }
334    }
335    false
336}

Trait Implementations§

Source§

impl Debug for User

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Ord for User

Source§

fn cmp(&self, other: &Self) -> Ordering

This method returns an [Ordering] between self and other. Read more
1.21.0§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for User

Source§

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for User

Source§

fn partial_cmp(&self, other: &Self) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl Serialize for User

Source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for User

Auto Trait Implementations§

§

impl Freeze for User

§

impl RefUnwindSafe for User

§

impl Send for User

§

impl Sync for User

§

impl Unpin for User

§

impl UnwindSafe for User

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of [From]<T> for U chooses to do.

§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.