mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-12-01 01:29:02 +08:00
fix kill main window in --server
This commit is contained in:
parent
8c39979848
commit
e57854422a
28
src/ipc.rs
28
src/ipc.rs
@ -699,6 +699,9 @@ async fn check_pid(postfix: &str) {
|
||||
}
|
||||
}
|
||||
}
|
||||
// if not remove old ipc file, the new ipc creation will fail
|
||||
// if we remove a ipc file, but the old ipc process is still running,
|
||||
// new connection to the ipc will connect to new ipc, old connection to old ipc still keep alive
|
||||
std::fs::remove_file(&Config::ipc_path(postfix)).ok();
|
||||
}
|
||||
|
||||
@ -985,31 +988,6 @@ pub async fn test_rendezvous_server() -> ResultType<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(windows)]
|
||||
pub fn is_ipc_file_exist(suffix: &str) -> ResultType<bool> {
|
||||
// Not change this to std::path::Path::exists, unless it can be ensured that it can find the ipc which occupied by a process that taskkill can't kill.
|
||||
let prefix = "\\\\.\\pipe\\";
|
||||
let file_name = Config::ipc_path(suffix).replace(prefix, "");
|
||||
let mut err = None;
|
||||
for entry in std::fs::read_dir(prefix)? {
|
||||
match entry {
|
||||
Ok(entry) => {
|
||||
if entry.file_name().into_string().unwrap_or_default() == file_name {
|
||||
return Ok(true);
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
err = Some(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
if let Some(e) = err {
|
||||
Err(e.into())
|
||||
} else {
|
||||
Ok(false)
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
pub async fn send_url_scheme(url: String) -> ResultType<()> {
|
||||
connect(1_000, "_url")
|
||||
|
@ -467,12 +467,9 @@ pub async fn start_server(is_server: bool) {
|
||||
std::thread::spawn(move || {
|
||||
if let Err(err) = crate::ipc::start("") {
|
||||
log::error!("Failed to start ipc: {}", err);
|
||||
#[cfg(windows)]
|
||||
if crate::is_server() && crate::ipc::is_ipc_file_exist("").unwrap_or(false) {
|
||||
if crate::is_server() {
|
||||
log::error!("ipc is occupied by another process, try kill it");
|
||||
if let Err(e) = crate::platform::try_kill_rustdesk_main_window_process() {
|
||||
log::error!("kill failed: {}", e);
|
||||
}
|
||||
std::thread::spawn(stop_main_window_process).join().ok();
|
||||
}
|
||||
std::process::exit(-1);
|
||||
}
|
||||
@ -636,3 +633,19 @@ async fn sync_and_watch_config_dir() {
|
||||
}
|
||||
log::warn!("skipped config sync");
|
||||
}
|
||||
|
||||
#[tokio::main(flavor = "current_thread")]
|
||||
pub async fn stop_main_window_process() {
|
||||
// this may also kill another --server process,
|
||||
// but --server usually can be auto restarted by --service, so it is ok
|
||||
if let Ok(mut conn) = crate::ipc::connect(1000, "").await {
|
||||
conn.send(&crate::ipc::Data::Close).await.ok();
|
||||
}
|
||||
#[cfg(windows)]
|
||||
{
|
||||
// in case above failure, e.g. zombie process
|
||||
if let Err(e) = crate::platform::try_kill_rustdesk_main_window_process() {
|
||||
log::error!("kill failed: {}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user