runk: Ignore an error when calling kill cmd with --all option

Ignore an error handling that is triggered when the kill command is called
with `--all option` to the stopped container.

High-level container runtimes such as containerd call the kill command with
`--all` option in order to terminate all processes inside the container
even if the container already is stopped. Hence, a low-level runtime
should allow `kill --all` regardless of the container state like runc.

This commit reverts to the previous behavior.

Fixes: #5555

Signed-off-by: Manabu Sugimoto <Manabu.Sugimoto@sony.com>
This commit is contained in:
Manabu Sugimoto 2022-11-01 17:01:19 +09:00
parent 288e337a6f
commit 16dca4ecd4
2 changed files with 11 additions and 9 deletions

View File

@ -83,14 +83,6 @@ impl Container {
}
pub fn kill(&self, signal: Signal, all: bool) -> Result<()> {
if self.state == ContainerState::Stopped {
return Err(anyhow!(
"container {} can't be killed because it is {:?}",
self.status.id,
self.state
));
}
if all {
let pids = self.processes()?;
for pid in pids {
@ -100,6 +92,16 @@ impl Container {
kill(pid, signal)?;
}
} else {
// If --all option is not specified and the container is stopped,
// kill operation generates an error in accordance with the OCI runtime spec.
if self.state == ContainerState::Stopped {
return Err(anyhow!(
"container {} can't be killed because it is {:?}",
self.status.id,
self.state
));
}
let pid = Pid::from_raw(self.status.pid);
if status::is_process_running(pid)? {
kill(pid, signal)?;

View File

@ -141,7 +141,7 @@ pub fn is_process_running(pid: Pid) -> Result<bool> {
match kill(pid, None) {
Err(errno) => {
if errno != Errno::ESRCH {
return Err(anyhow!("no such process"));
return Err(anyhow!("failed to kill process {}: {:?}", pid, errno));
}
Ok(false)
}