我有一个 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();
}
杀死无响应进程的唯一方法是右键单击它并在任务栏中强制杀死它。
查看
sysinfo
创建的文档(https://docs.rs/sysinfo/latest/sysinfo/struct.Process.html),还有另一种方法称为kill_with
。
我不熟悉 Windows 上的终止进程,但我假设您必须在 Unix/Linux 系统上找到相当于
kill -9
的内容。 Process::kill
似乎只发送kill -2
,这对无响应的进程没有影响。