Найти Π² Π”Π·Π΅Π½Π΅

πŸ¦€ Ctrl+C Π² Rust: ΠΊΠ°ΠΊ Π½Π΅ ΠΈΡΠΏΠΎΡ€Ρ‚ΠΈΡ‚ΡŒ Тизнь ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρƒ

ОглавлСниС
НСоново-Π·Π΅Π»Ρ‘Π½Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», клавиши Β«CtrlΒ» ΠΈ Β«CΒ» Π²ΡΠΏΡ‹Ρ…ΠΈΠ²Π°ΡŽΡ‚, Π° ΠΌΠΎΠ»ΠΎΡ‚ΠΎΠΊ символичСски Β«Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚Β» ΠΌΠ΅Π»ΠΊΠΈΡ… Π·ΠΎΠΌΠ±ΠΈ-Ρ‡Π΅Ρ€Π΅ΠΏΠΊΠΈ процСссов β€” ΠΎΠ±Ρ€Π°Π· Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ, бСзопасного прСрывания Rust-прилоТСния ΠΈ убийства Π·Π°Π²ΠΈΡΡˆΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ².
НСоново-Π·Π΅Π»Ρ‘Π½Ρ‹ΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π», клавиши Β«CtrlΒ» ΠΈ Β«CΒ» Π²ΡΠΏΡ‹Ρ…ΠΈΠ²Π°ΡŽΡ‚, Π° ΠΌΠΎΠ»ΠΎΡ‚ΠΎΠΊ символичСски Β«Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚Β» ΠΌΠ΅Π»ΠΊΠΈΡ… Π·ΠΎΠΌΠ±ΠΈ-Ρ‡Π΅Ρ€Π΅ΠΏΠΊΠΈ процСссов β€” ΠΎΠ±Ρ€Π°Π· Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ, бСзопасного прСрывания Rust-прилоТСния ΠΈ убийства Π·Π°Π²ΠΈΡΡˆΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ².

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ всСгда Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ особой остороТности, вСдь Π½Π΅Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ с Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌΠΈ процСссами Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² ΠΊΠΎΡˆΠΌΠ°Ρ€ ΠΈΠ· Ρ…Π°ΠΎΡ‚ΠΈΡ‡Π½Ρ‹Ρ… символов ΠΈ висящих процСссов. Π’ Π½ΠΎΠ²ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΎΡ‚ Николаса Π”ΠΆΠΎΠ·Π΅Ρ„Π° ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Fiveonefour ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ разбираСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, знакомая ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Rust-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ: «Как ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ процСссы ΠΈ ΠΎΡ‡ΠΈΡ‰Π°Ρ‚ΡŒ состояниС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Ctrl+C?Β».

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° каТСтся банальной Ρ€ΠΎΠ²Π½ΠΎ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠ°ΠΊ Π²Ρ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚Π΅ΡΡŒ с Π½Π΅ΠΉ Π²ΠΆΠΈΠ²ΡƒΡŽ. Один Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ шаг β€” ΠΈ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅:

  • πŸ§Ÿβ€β™‚οΈ Β«Π—ΠΎΠΌΠ±ΠΈ-процСссы», ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² Ρ„ΠΎΠ½Π΅ послС закрытия прилоТСния.
  • πŸ“Ί Π˜ΡΠΊΠ°ΠΆΡ‘Π½Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, ΠΊΠΎΠ³Π΄Π° вмСсто чистого ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ΅Π½ΠΈΡ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅ странныС символы.
  • πŸŒ€ ЗависаниС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, ΠΊΠΎΠ³Π΄Π° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹.

Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрёмся, ΠΊΠ°ΠΊ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ всСго этого уТаса, ΠΎΠΏΠΈΡ€Π°ΡΡΡŒ Π½Π° ΠΎΠΏΡ‹Ρ‚ Π°Π²Ρ‚ΠΎΡ€Π°, ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ этому собствСнноС Π²ΠΈΠ΄Π΅Π½ΠΈΠ΅.

πŸ“Œ РСшСниС β„–1: ΠŸΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π° процСссов Ρ‡Π΅Ρ€Π΅Π· систСму логирования

ΠŸΠ΅Ρ€Π²Π°Ρ ошибка, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ β€” прямоС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ stdout/stderr Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов ΠΊ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρƒ. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°ΠΌ ΠΈ "Π³ΠΎΠ½ΠΊΠ°ΠΌ" (race conditions), ΠΊΠΎΠ³Π΄Π° процСсс ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΡƒΠΆΠ΅ послС Π΅Π³ΠΎ закрытия.

βœ… Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ:

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ pipe-Ρ‹ (Ρ‡Π΅Ρ€Π΅Π· Stdio::piped()) для Π²Ρ‹Π²ΠΎΠ΄Π°.
  • ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΠΉΡ‚Π΅ Π²Ρ‹Π²ΠΎΠ΄ ΠΈ пСрСнаправляйтС Π΅Π³ΠΎ Π² систСму логирования (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, log, tracing).
  • НС Π·Π°Π±Ρ‹Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎ graceful error handling: Π²Ρ‹Π²ΠΎΠ΄ процСссов ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ ΠΎΠ±ΠΎΡ€Π²Π°Ρ‚ΡŒΡΡ, ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΊ этому Π³ΠΎΡ‚ΠΎΠ²ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° Rust (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Tokio):

let mut child = Command::new("docker")
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.stdin(Stdio::null()) // Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ stdin
.spawn()?;

// ΠŸΡ€ΠΎΠΊΡΠΈΡ€ΡƒΠ΅ΠΌ stdout/stderr
let stdout_proxy = tokio::spawn(proxy_output(child.stdout.take().unwrap(), "stdout"));
let stderr_proxy = tokio::spawn(proxy_output(child.stderr.take().unwrap(), "stderr"));

🧹 РСшСниС β„–2: ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ сброс состояния Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° (с crossterm)

Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΆΠΌΡ‘Ρ‚ Ctrl+C, Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» часто остаётся Π² «сыром Ρ€Π΅ΠΆΠΈΠΌΠ΅Β» (raw mode), Π° курсор β€” спрятанным. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Π²ΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄ ломаСтся, Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ раздраТаСтся.

βœ… Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ:

ВсСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ crossterm, которая обСспСчиваСт ΠΊΡ€ΠΎΡΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΡƒΡŽ очистку состояния Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°:

use crossterm::{
cursor::Show,
execute,
terminal::{disable_raw_mode, LeaveAlternateScreen},
};
fn cleanup_terminal() {
disable_raw_mode().ok();
execute!(stdout(), LeaveAlternateScreen, Show).ok();
}

ИспользованиС ok() вмСсто unwrap() Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ очистка всСгда Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, Π΄Π°ΠΆΠ΅ Ссли Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΡƒΠΆΠ΅ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ состоянии.

πŸ”Œ РСшСниС β„–3: Π“Ρ€Π°Ρ†ΠΈΠΎΠ·Π½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов

Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ источник ΠΊΠΎΡˆΠΌΠ°Ρ€Π° β€” висящиС процСссы, Π½Π΅ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π° Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ прилоТСния. Автор ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ сигналов:

  • 🟑 SIGTERM: ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ (с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅).
  • πŸ”΄ SIGKILL: Тёсткая остановка, Ссли процСсс Π½Π΅ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° SIGTERM.

И всСгда устанавливайтС Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚!

async fn graceful_shutdown(mut child: Child) {
child.start_kill().ok(); // SIGTERM
tokio::select! {
_ = child.wait() => info!("ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ"),
_ = tokio::time::sleep(Duration::from_secs(5)) => {
child.kill().await.ok(); // SIGKILL
warn!("ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ");
}
}
}

🎑 РСшСниС β„–4: Бинхронизация ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² (спиннСров)

Если вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, спиннСр Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ), ΠΎΠ½Π° Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ с Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ процСссов, создавая ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρƒ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅:

Compiling Backend... β Ή
DEBUG: User authenticated.
β Έ # Π’ΠΎΡ‚ это ΠΏΠ»ΠΎΡ…ΠΎ!
user@machine:~$

βœ… Как ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ:

  • Атомарно управляйтС состояниСм Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· AtomicBool.
  • Π Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ строки Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.
  • ВсСгда Π·Π°Π²Π΅Ρ€ΡˆΠ°ΠΉΡ‚Π΅ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ Π΄ΠΎ очистки.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°:

impl Spinner {
fn stop(&self) {
self.stop_flag.store(true, Ordering::SeqCst);
if let Some(handle) = &self.handle {
handle.join().ok(); // ДоТидаСмся Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ
}
self.clear_line(); // ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ строку
}
}

πŸ’‘ Π›ΠΈΡ‡Π½ΠΎΠ΅ ΠΌΠ½Π΅Π½ΠΈΠ΅: ΠΏΠΎΡ‡Π΅ΠΌΡƒ это ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ?

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° CLI-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Rust сСгодня β€” это особый Ρ‚Ρ€Π΅Π½Π΄. Rust позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ быстрыС ΠΈ Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹Π΅ инструмСнты, Π½ΠΎ удобство ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ зависит ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΡ… ΠΌΠ΅Π»ΠΎΡ‡Π΅ΠΉ, ΠΊΠ°ΠΊ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ очистка Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

МногиС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ эти аспСкты, думая, Ρ‡Ρ‚ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Однако ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ наибольшСС Ρ€Π°Π·Π΄Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ приводят ΠΊ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΎΡ‚Π·Ρ‹Π²Π°ΠΌ, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ β€” ΠΊ ΠΏΠΎΡ‚Π΅Ρ€Π΅ довСрия ΠΊ инструмСнту.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ настроСнноС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ процСссами β€” Π½Π΅ просто тСхничСская Π΄Π΅Ρ‚Π°Π»ΡŒ, Π° ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт качСствСнного ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°.

🚩 Π˜Ρ‚ΠΎΠ³: Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ для ΠΊΠΎΠΌΡ„ΠΎΡ€Ρ‚Π½ΠΎΠ³ΠΎ CLI-прилоТСния Π½Π° Rust:

  • πŸ” ВсСгда проксируйтС Π²Ρ‹Π²ΠΎΠ΄ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… процСссов.
  • ♻️ ВосстанавливайтС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ (crossterm).
  • πŸ›‘ Π—Π°Π²Π΅Ρ€ΡˆΠ°ΠΉΡ‚Π΅ процСссы поэтапно: сначала мягко (SIGTERM), Π·Π°Ρ‚Π΅ΠΌ Тёстко (SIGKILL).
  • 🎯 Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ всС Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΈ взаимодСйствиС с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎ.

БлСдуя этим ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ, Π²Ρ‹ обСспСчитС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ чистый, ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΈ приятный ΠΎΠΏΡ‹Ρ‚ взаимодСйствия с вашим CLI-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° Rust.

πŸ”— ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ссылки: