proc_cli/commands/
thaw.rs1#[cfg(unix)]
14use crate::core::{
15 apply_to_each, flatten_targets, guard_targets, resolve_targets_excluding_self, Guards,
16 NameMatch, Process,
17};
18use crate::error::{ProcError, Result};
19#[cfg(unix)]
20use crate::ui::Printer;
21use clap::Args;
22
23#[derive(Args, Debug)]
25pub struct ThawCommand {
26 #[arg(required = true, num_args = 1.., value_parser = crate::core::validate_target_arg)]
28 pub target: Vec<String>,
29
30 #[arg(long, short = 'y')]
32 pub yes: bool,
33
34 #[arg(long)]
36 pub dry_run: bool,
37
38 #[arg(long, short = 'j')]
40 pub json: bool,
41
42 #[arg(long, short = 'v')]
44 pub verbose: bool,
45
46 #[arg(long = "in", short = 'i', num_args = 0..=1, default_missing_value = ".")]
49 pub in_dir: Option<String>,
50
51 #[arg(long = "by", short = 'b')]
53 pub by_name: Option<String>,
54
55 #[arg(long = "start-time", value_name = "SECONDS")]
58 pub start_time: Option<u64>,
59
60 #[arg(long)]
62 pub cmd: bool,
63}
64
65impl ThawCommand {
66 #[cfg(unix)]
68 pub fn execute(&self) -> Result<()> {
69 use nix::sys::signal::Signal;
70
71 let printer = Printer::from_flags(self.json, self.verbose);
72
73 let targets = flatten_targets(&self.target);
74 let mode = NameMatch::from_flag(self.cmd);
75 let resolved = resolve_targets_excluding_self(&targets, mode);
76
77 if let Some(warning) = resolved.warning() {
78 printer.warning(&warning);
79 }
80 let printer = printer.with_not_found(&resolved.not_found);
82 let mut processes = resolved.processes;
83
84 let guards = Guards::new(&self.in_dir, &self.by_name, self.start_time);
86 guard_targets(&mut processes, &self.target, &guards, mode)?;
87
88 if self.dry_run || !self.yes {
92 Process::measure_cpu(&mut processes);
93 }
94
95 if processes.is_empty() {
96 return Err(ProcError::ProcessNotFound(self.target.join(" ")));
97 }
98
99 if self.dry_run {
100 printer.print_dry_run("thaw", &processes);
101 return Ok(());
102 }
103
104 if !printer.ask_confirm("thaw", &processes, self.yes)? {
105 return Ok(());
106 }
107
108 let (succeeded, failed) =
109 apply_to_each(&processes, |proc| proc.send_signal(Signal::SIGCONT));
110
111 printer.print_action_result("thaw", &succeeded, &failed)
112 }
113
114 #[cfg(not(unix))]
116 pub fn execute(&self) -> Result<()> {
117 Err(ProcError::NotSupported(
118 "thaw (SIGCONT) is not supported on Windows".to_string(),
119 ))
120 }
121}