如何在 Windows 上使用 Rust 以编程方式终止无响应的进程?

问题描述 投票:0回答:1

我有一个 Windows Rust 应用程序,只允许运行 1 个实例。它使用基于文件的锁来确保一次只能打开 1 个进程。有时,应用程序会变得无响应,当用户再次打开它时,它不会终止无响应的进程。如果该进程正在运行并且用户尝试打开另一个进程,则会成功终止旧进程。有没有办法强制杀死无响应的进程?

这是实现:

lazy_static! {
    static ref LOCK_PATH: PathBuf = env::temp_dir().join("tl-lock");
    static ref EXE_NAME: String = {
        let exe_path = env::current_exe().unwrap();
        exe_path
            .file_name()
            .expect("Cannot get EXE name")
            .to_str()
            .expect("Invalid EXE name")
            .to_string()
    };
}


/// Terminate all processes that have the same name
/// This prevents people from having multiple copies open
fn kill_dangling_processes() {
    let exe_name = &*EXE_NAME;
    let sys = System::new_all();
    for (_, process) in sys.processes() {
        if process.name() == exe_name {
            process.kill();
        }
    }
}

/// This function is ran on start
pub fn lock() {
    if LOCK_PATH.exists() {
        kill_dangling_processes();
        return;
    }
    fs::write(LOCK_PATH.clone(), "locked").unwrap();
}


杀死无响应进程的唯一方法是右键单击它并在任务栏中强制杀死它。

rust process window locking
1个回答
0
投票

查看

sysinfo
创建的文档(https://docs.rs/sysinfo/latest/sysinfo/struct.Process.html),还有另一种方法称为
kill_with

我不熟悉 Windows 上的终止进程,但我假设您必须在 Unix/Linux 系统上找到相当于

kill -9
的内容。
Process::kill
似乎只发送
kill -2
,这对无响应的进程没有影响。

© www.soinside.com 2019 - 2024. All rights reserved.