diff --git a/src/runtime-rs/crates/runtimes/common/src/types/mod.rs b/src/runtime-rs/crates/runtimes/common/src/types/mod.rs index 0e6f80a4f..3772a8a7c 100644 --- a/src/runtime-rs/crates/runtimes/common/src/types/mod.rs +++ b/src/runtime-rs/crates/runtimes/common/src/types/mod.rs @@ -184,6 +184,7 @@ pub enum ProcessStatus { Stopped = 3, Paused = 4, Pausing = 5, + Exited = 6, } #[derive(Debug, Clone)] diff --git a/src/runtime-rs/crates/runtimes/common/src/types/trans_into_shim.rs b/src/runtime-rs/crates/runtimes/common/src/types/trans_into_shim.rs index 3c3134e8f..345e02d93 100644 --- a/src/runtime-rs/crates/runtimes/common/src/types/trans_into_shim.rs +++ b/src/runtime-rs/crates/runtimes/common/src/types/trans_into_shim.rs @@ -56,6 +56,7 @@ impl From for api::Status { ProcessStatus::Stopped => api::Status::STOPPED, ProcessStatus::Paused => api::Status::PAUSED, ProcessStatus::Pausing => api::Status::PAUSING, + ProcessStatus::Exited => api::Status::STOPPED, } } } diff --git a/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/container_inner.rs b/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/container_inner.rs index 5e1cbb398..b041af076 100644 --- a/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/container_inner.rs +++ b/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/container_inner.rs @@ -200,20 +200,22 @@ impl ContainerInner { return Ok(()); } - self.check_state(vec![ProcessStatus::Running]) + self.check_state(vec![ProcessStatus::Running, ProcessStatus::Exited]) .await .context("check state")?; - // if use force mode to stop container, stop always successful - // send kill signal to container - // ignore the error of sending signal, since the process would - // have been killed and exited yet. - self.signal_process(process, Signal::SIGKILL as u32, false) - .await - .map_err(|e| { - warn!(logger, "failed to signal kill. {:?}", e); - }) - .ok(); + if state == ProcessStatus::Running { + // if use force mode to stop container, stop always successful + // send kill signal to container + // ignore the error of sending signal, since the process would + // have been killed and exited yet. + self.signal_process(process, Signal::SIGKILL as u32, false) + .await + .map_err(|e| { + warn!(logger, "failed to signal kill. {:?}", e); + }) + .ok(); + } match process.process_type { ProcessType::Container => self diff --git a/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/process.rs b/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/process.rs index 5953f2f69..438a817e2 100644 --- a/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/process.rs +++ b/src/runtime-rs/crates/runtimes/virt_container/src/container_manager/process.rs @@ -182,7 +182,7 @@ impl Process { drop(exit_status); let mut status = status.write().await; - *status = ProcessStatus::Stopped; + *status = ProcessStatus::Exited; drop(status); drop(exit_notifier);