diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index a1c917d7..afdf3557 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -2,12 +2,12 @@ use super::service; use super::{clash_api, logger::Logger}; use crate::log_err; use crate::{config::*, utils::dirs}; -use anyhow::{bail, Context, Result}; +use anyhow::{bail, Result}; use once_cell::sync::OnceCell; use parking_lot::Mutex; use serde_yaml::Mapping; -use std::{fs, io::Write, sync::Arc, time::Duration}; -use sysinfo::{Pid, System}; +use std::{sync::Arc, time::Duration}; +use sysinfo::System; use tauri::api::process::{Command, CommandChild, CommandEvent}; use tokio::time::sleep; @@ -30,21 +30,6 @@ impl CoreManager { } pub fn init(&self) -> Result<()> { - // kill old clash process - let _ = dirs::clash_pid_path() - .and_then(|path| fs::read(path).map(|p| p.to_vec()).context("")) - .and_then(|pid| String::from_utf8_lossy(&pid).parse().context("")) - .map(|pid| { - let mut system = System::new(); - system.refresh_all(); - if let Some(proc) = system.process(Pid::from_u32(pid)) { - if proc.name().contains("clash") { - log::debug!(target: "app", "kill old clash process"); - proc.kill(); - } - } - }); - tauri::async_runtime::spawn(async { // 启动clash log_err!(Self::global().run_core().await); @@ -95,6 +80,14 @@ impl CoreManager { None => false, }; + let mut system = System::new(); + system.refresh_all(); + let procs = system.processes_by_name("clash-meta"); + for proc in procs { + log::debug!(target: "app", "kill all clash process"); + proc.kill(); + } + if *self.use_service_mode.lock() { log::debug!(target: "app", "stop the core by service"); log_err!(service::stop_core_by_service().await); @@ -149,17 +142,6 @@ impl CoreManager { let cmd = Command::new_sidecar(clash_core)?; let (mut rx, cmd_child) = cmd.args(args).spawn()?; - // 将pid写入文件中 - crate::log_err!((|| { - let pid = cmd_child.pid(); - let path = dirs::clash_pid_path()?; - fs::File::create(path) - .context("failed to create the pid file")? - .write(format!("{pid}").as_bytes()) - .context("failed to write pid to the file")?; - >::Ok(()) - })()); - let mut sidecar = self.sidecar.lock(); *sidecar = Some(cmd_child); drop(sidecar); @@ -256,6 +238,13 @@ impl CoreManager { log::debug!(target: "app", "stop the core by sidecar"); let _ = child.kill(); } + let mut system = System::new(); + system.refresh_all(); + let procs = system.processes_by_name("clash-meta"); + for proc in procs { + log::debug!(target: "app", "kill all clash process"); + proc.kill(); + } Ok(()) } diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs index 675a78eb..deda1c1f 100644 --- a/src-tauri/src/utils/dirs.rs +++ b/src-tauri/src/utils/dirs.rs @@ -88,10 +88,6 @@ pub fn profiles_path() -> Result { Ok(app_home_dir()?.join(PROFILE_YAML)) } -pub fn clash_pid_path() -> Result { - Ok(app_home_dir()?.join("clash.pid")) -} - #[cfg(not(target_os = "windows"))] pub fn service_path() -> Result { Ok(app_resources_dir()?.join("clash-verge-service"))