diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock
index 9090bd1e4d6b8040dfc3154b752ee05786418efd..c4b49a210691fa079fc621e1bcda83d044e57dad 100644
--- a/src-tauri/Cargo.lock
+++ b/src-tauri/Cargo.lock
@@ -511,6 +511,7 @@ dependencies = [
  "serde",
  "serde_json",
  "serde_yaml",
+ "sysinfo",
  "tauri",
  "tauri-build",
  "tokio",
@@ -674,6 +675,31 @@ dependencies = [
  "crossbeam-utils",
 ]
 
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1"
+dependencies = [
+ "autocfg",
+ "cfg-if 1.0.0",
+ "crossbeam-utils",
+ "memoffset",
+ "once_cell",
+ "scopeguard",
+]
+
 [[package]]
 name = "crossbeam-utils"
 version = "0.8.10"
@@ -2244,6 +2270,15 @@ dependencies = [
  "minimal-lexical",
 ]
 
+[[package]]
+name = "ntapi"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f"
+dependencies = [
+ "winapi",
+]
+
 [[package]]
 name = "num-derive"
 version = "0.3.3"
@@ -2955,6 +2990,30 @@ dependencies = [
  "cty",
 ]
 
+[[package]]
+name = "rayon"
+version = "1.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d"
+dependencies = [
+ "autocfg",
+ "crossbeam-deque",
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
 [[package]]
 name = "redox_syscall"
 version = "0.2.13"
@@ -3650,6 +3709,21 @@ dependencies = [
  "unicode-ident",
 ]
 
+[[package]]
+name = "sysinfo"
+version = "0.26.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ae2421f3e16b3afd4aa692d23b83d0ba42ee9b0081d5deeb7d21428d7195fb1"
+dependencies = [
+ "cfg-if 1.0.0",
+ "core-foundation-sys",
+ "libc",
+ "ntapi",
+ "once_cell",
+ "rayon",
+ "winapi",
+]
+
 [[package]]
 name = "system-deps"
 version = "5.0.0"
diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml
index bdf0d7ec776631926dab8b09f3b1728db2333a08..4dfdceaf8236da7237dcf065ca48a54d477de44a 100644
--- a/src-tauri/Cargo.toml
+++ b/src-tauri/Cargo.toml
@@ -23,6 +23,7 @@ dunce = "1.0.2"
 log4rs = "1.0.0"
 nanoid = "0.4.0"
 chrono = "0.4.19"
+sysinfo = "0.26.2"
 serde_json = "1.0"
 serde_yaml = "0.8"
 auto-launch = "0.3"
diff --git a/src-tauri/src/core/mod.rs b/src-tauri/src/core/mod.rs
index c1e92a76ada23226d0dc04f269b51ca0e9d8ea7c..70b0e5c44d162bbd725f4d751d631922d5bfd3f9 100644
--- a/src-tauri/src/core/mod.rs
+++ b/src-tauri/src/core/mod.rs
@@ -53,6 +53,9 @@ impl Core {
 
   /// initialize the core state
   pub fn init(&self, app_handle: tauri::AppHandle) {
+    // kill old clash process
+    Service::kill_old_clash();
+
     let verge = self.verge.lock();
     let clash_core = verge.clash_core.clone();
 
diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs
index ccd37684d4fa283720483e3485e9396f9464fba8..8557dcd74d498ead3eb6fd8abb196a04b1135aa0 100644
--- a/src-tauri/src/core/service.rs
+++ b/src-tauri/src/core/service.rs
@@ -4,6 +4,8 @@ use crate::utils::{config, dirs};
 use anyhow::{bail, Result};
 use reqwest::header::HeaderMap;
 use serde_yaml::Mapping;
+use std::fs;
+use std::io::Write;
 use std::{collections::HashMap, time::Duration};
 use tauri::api::process::{Command, CommandChild, CommandEvent};
 use tokio::time::sleep;
@@ -99,6 +101,14 @@ impl Service {
     let cmd = Command::new_sidecar(clash_core)?;
     let (mut rx, cmd_child) = cmd.args(["-d", app_dir]).spawn()?;
 
+    // 将pid写入文件中
+    let pid = cmd_child.pid();
+    log_if_err!(|| -> Result<()> {
+      let path = dirs::clash_pid_path();
+      fs::File::create(path)?.write(format!("{pid}").as_bytes())?;
+      Ok(())
+    }());
+
     self.sidecar = Some(cmd_child);
 
     // clash log
@@ -217,6 +227,23 @@ impl Service {
 
     Ok((server, headers))
   }
+
+  /// kill old clash process
+  pub fn kill_old_clash() {
+    use sysinfo::{Pid, PidExt, ProcessExt, System, SystemExt};
+
+    if let Ok(pid) = fs::read(dirs::clash_pid_path()) {
+      if let Ok(pid) = String::from_utf8_lossy(&pid).parse() {
+        let mut system = System::new();
+        system.refresh_all();
+
+        let proc = system.process(Pid::from_u32(pid));
+        if let Some(proc) = proc {
+          proc.kill();
+        }
+      }
+    }
+  }
 }
 
 impl Drop for Service {
diff --git a/src-tauri/src/utils/dirs.rs b/src-tauri/src/utils/dirs.rs
index 90bd2a2089c4e79af20d7369e6c930c37a2010b3..3467c34e5c6afba461c46facfe053eeb7e25145d 100644
--- a/src-tauri/src/utils/dirs.rs
+++ b/src-tauri/src/utils/dirs.rs
@@ -15,7 +15,6 @@ static VERGE_CONFIG: &str = "verge.yaml";
 static PROFILE_YAML: &str = "profiles.yaml";
 static PROFILE_TEMP: &str = "clash-verge-runtime.yaml";
 
-#[cfg(windows)]
 static mut RESOURCE_DIR: Option<PathBuf> = None;
 
 /// portable flag
@@ -65,7 +64,6 @@ pub fn app_resources_dir(package_info: &PackageInfo) -> PathBuf {
     .unwrap()
     .join("resources");
 
-  #[cfg(windows)]
   unsafe {
     RESOURCE_DIR = Some(res_dir.clone());
   }
@@ -103,6 +101,10 @@ pub fn profiles_temp_path() -> PathBuf {
   return app_home_dir().join(PROFILE_TEMP);
 }
 
+pub fn clash_pid_path() -> PathBuf {
+  unsafe { RESOURCE_DIR.clone().unwrap().join("clash.pid") }
+}
+
 #[cfg(windows)]
 static SERVICE_PATH: &str = "clash-verge-service.exe";