#child-process #guard #termination #ensure #ctrl-c #proper #strategies

proc_guard

确保在各种场景下适当销毁子进程的过程守护者

2 个不稳定版本

0.2.0 2024年7月30日
0.1.0 2024年7月19日

#1 in #proper

Download history 119/week @ 2024-07-14 17/week @ 2024-07-21 137/week @ 2024-07-28 4/week @ 2024-08-04

277 每月下载量

MIT 许可协议

25KB
174

proc_guard

proc_guard 是一个 Rust 包,旨在使用各种终止策略来管理和确保子进程的适当终止。此包为子进程提供了一个守护者,确保当守护者被丢弃时,进程按照指定的策略终止。

功能

  • 不同的终止策略,如等待、发送 Ctrl+C 和杀死进程。
  • 确保守护者超出作用域时子进程的适当清理。
  • 支持基于阻塞和基于超时的终止方法。

安装

将以下内容添加到您的 Cargo.toml

[dependencies]
proc_guard = "0.2.0"

使用方法

以下是一些说明如何使用 ProcGuard 包的示例。

示例 1:基本使用

use std::process::Command;
use proc_guard::{ProcGuard, ProcessTermination};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let child = if cfg!(target_os = "windows") {
        Command::new("timeout").args(["/t", "2"]).spawn()?
    } else {
        Command::new("sleep").arg("2").spawn()?
    };

    let guard = ProcGuard::new(child, ProcessTermination::Wait);
    // The child process will be waited upon until it exits.
    Ok(())
}

示例 2:使用 Ctrl+C 和等待

use std::process::Command;
use proc_guard::{ProcGuard, ProcessTermination};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let child = if cfg!(target_os = "windows") {
        Command::new("timeout").args(["/t", "2"]).spawn()?
    } else {
        Command::new("sleep").arg("2").spawn()?
    };

    let guard = ProcGuard::new(child, ProcessTermination::CtrlCWait);
    // The child process will receive a Ctrl+C signal and will be waited upon until it exits.
    Ok(())
}

示例 3:启动一个新的受守护进程

use std::process::Command;
use proc_guard::{ProcGuard, ProcessTermination};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let guard = if cfg!(target_os = "windows") {
        ProcGuard::spawn(Command::new("timeout").args(["/t", "2"]), ProcessTermination::CtrlCWait)?
    } else {
        ProcGuard::spawn(Command::new("sleep").arg("2"), ProcessTermination::CtrlCWait)?
    };
    // The child process will be managed and terminated as specified.
    Ok(())
}

示例 4:释放守护者

use std::process::Command;
use proc_guard::{ProcGuard, ProcessTermination};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let child = if cfg!(target_os = "windows") {
        Command::new("timeout").args(["/t", "2"]).spawn()?
    } else {
        Command::new("sleep").arg("2").spawn()?
    };

    let guard = ProcGuard::new(child, ProcessTermination::Wait);
    let child = guard.release();
    // The child process is now unmanaged and must be manually handled.
    Ok(())
}

终止策略

ProcessTermination 枚举提供了终止进程的各种策略

  • Wait:无限期等待进程退出。
  • WaitTimeout(Duration):等待指定时间后进程退出。
  • WaitTimeoutKill(Duration):等待指定时间,如果进程尚未退出,则杀死进程。
  • CtrlC:向进程发送 Ctrl+C 信号,不等待。
  • CtrlCWait:发送 Ctrl+C 信号,无限期等待进程退出。
  • CtrlCWaitTimeout(Duration):发送 Ctrl+C 信号,等待指定时间后进程退出。
  • CtrlCWaitTimeoutKill(Duration):发送 Ctrl+C 信号,等待指定时间,如果进程尚未退出,则杀死进程。
  • Kill:立即杀死进程,不等待。
  • KillWait:立即杀死进程,无限期等待进程退出。

许可协议

本项目采用 MIT 许可协议。有关详细信息,请参阅 LICENSE 文件。

依赖关系

~0.3–1.2MB
~23K SLoC