libcontainer/container/
container_pause.rs1use libcgroups::common::{CgroupManager, FreezerState};
2
3use super::{Container, ContainerStatus};
4use crate::error::LibcontainerError;
5
6impl Container {
7 pub fn pause(&mut self) -> Result<(), LibcontainerError> {
28 self.refresh_status()?;
29
30 if !self.can_pause() {
31 tracing::error!(status = ?self.status(), id = ?self.id(), "cannot pause container");
32 return Err(LibcontainerError::IncorrectStatus(self.status()));
33 }
34
35 let cmanager =
36 libcgroups::common::create_cgroup_manager(libcgroups::common::CgroupConfig {
37 cgroup_path: self.spec()?.cgroup_path,
38 systemd_cgroup: self.systemd(),
39 container_name: self.id().to_string(),
40 })?;
41 cmanager.freeze(FreezerState::Frozen)?;
42
43 tracing::debug!("saving paused status");
44 self.set_status(ContainerStatus::Paused).save()?;
45
46 tracing::debug!("container {} paused", self.id());
47 Ok(())
48 }
49}