2021-09-20 22:26:35 +02:00
|
|
|
use super::{Container, ContainerStatus};
|
2021-10-05 17:38:52 +02:00
|
|
|
use crate::signal::Signal;
|
2021-09-21 23:03:12 +02:00
|
|
|
use anyhow::{bail, Context, Result};
|
2021-10-05 17:38:52 +02:00
|
|
|
use nix::sys::signal::{self};
|
2021-09-20 22:26:35 +02:00
|
|
|
|
|
|
|
impl Container {
|
2021-09-24 11:58:15 +02:00
|
|
|
/// Sends the specified signal to the container init process
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// ```no_run
|
|
|
|
/// use youki::container::builder::ContainerBuilder;
|
|
|
|
/// use youki::syscall::syscall::create_syscall;;
|
|
|
|
/// use nix::sys::signal::Signal;
|
|
|
|
///
|
|
|
|
/// # fn main() -> anyhow::Result<()> {
|
|
|
|
/// let mut container = ContainerBuilder::new("74f1a4cb3801".to_owned(), create_syscall().as_ref())
|
|
|
|
/// .as_init("/var/run/docker/bundle")
|
|
|
|
/// .build()?;
|
|
|
|
///
|
|
|
|
/// container.kill(Signal::SIGKILL)?;
|
|
|
|
/// # Ok(())
|
|
|
|
/// # }
|
|
|
|
/// ```
|
2021-10-05 17:38:52 +02:00
|
|
|
pub fn kill<S: Into<Signal>>(&mut self, signal: S) -> Result<()> {
|
|
|
|
let signal = signal.into().into_raw();
|
2021-09-21 23:03:12 +02:00
|
|
|
self.refresh_status()
|
|
|
|
.context("failed to refresh container status")?;
|
2021-09-20 22:26:35 +02:00
|
|
|
if self.can_kill() {
|
|
|
|
log::debug!("kill signal {} to {}", signal, self.pid().unwrap());
|
|
|
|
signal::kill(self.pid().unwrap(), signal)?;
|
2021-09-23 23:05:35 +02:00
|
|
|
self.set_status(ContainerStatus::Stopped).save()?;
|
2021-09-20 22:26:35 +02:00
|
|
|
std::process::exit(0)
|
|
|
|
} else {
|
|
|
|
bail!(
|
|
|
|
"{} could not be killed because it was {:?}",
|
|
|
|
self.id(),
|
|
|
|
self.status()
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|