mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-04-28 19:54:35 +00:00
agent: don't exit early if signal fails due to ESRCH
ESRCH usually means the process has exited. In this case, the execution should continue to kill remaining container processes. Fixes: #5366 Signed-off-by: Feng Wang <feng.wang@databricks.com> [Fix up cargo updates] Signed-off-by: Peng Tao <bergwolf@hyper.sh>
This commit is contained in:
parent
ff62cedd26
commit
ef5a2dc3bf
2
src/agent/Cargo.lock
generated
2
src/agent/Cargo.lock
generated
@ -1507,7 +1507,7 @@ dependencies = [
|
|||||||
"lazy_static",
|
"lazy_static",
|
||||||
"libc",
|
"libc",
|
||||||
"libseccomp",
|
"libseccomp",
|
||||||
"nix 0.23.1",
|
"nix 0.24.2",
|
||||||
"oci",
|
"oci",
|
||||||
"path-absolutize",
|
"path-absolutize",
|
||||||
"protobuf",
|
"protobuf",
|
||||||
|
@ -12,7 +12,7 @@ serde_derive = "1.0.91"
|
|||||||
oci = { path = "../../libs/oci" }
|
oci = { path = "../../libs/oci" }
|
||||||
protocols = { path ="../../libs/protocols" }
|
protocols = { path ="../../libs/protocols" }
|
||||||
caps = "0.5.0"
|
caps = "0.5.0"
|
||||||
nix = "0.23.0"
|
nix = "0.24.2"
|
||||||
scopeguard = "1.0.0"
|
scopeguard = "1.0.0"
|
||||||
capctl = "0.2.0"
|
capctl = "0.2.0"
|
||||||
lazy_static = "1.3.0"
|
lazy_static = "1.3.0"
|
||||||
|
@ -6,8 +6,9 @@
|
|||||||
use anyhow::{anyhow, Result};
|
use anyhow::{anyhow, Result};
|
||||||
use nix::errno::Errno;
|
use nix::errno::Errno;
|
||||||
use nix::pty;
|
use nix::pty;
|
||||||
use nix::sys::{socket, uio};
|
use nix::sys::socket;
|
||||||
use nix::unistd::{self, dup2};
|
use nix::unistd::{self, dup2};
|
||||||
|
use std::io::IoSlice;
|
||||||
use std::os::unix::io::{AsRawFd, RawFd};
|
use std::os::unix::io::{AsRawFd, RawFd};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
@ -23,10 +24,7 @@ pub fn setup_console_socket(csocket_path: &str) -> Result<Option<RawFd>> {
|
|||||||
None,
|
None,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
match socket::connect(
|
match socket::connect(socket_fd, &socket::UnixAddr::new(Path::new(csocket_path))?) {
|
||||||
socket_fd,
|
|
||||||
&socket::SockAddr::Unix(socket::UnixAddr::new(Path::new(csocket_path))?),
|
|
||||||
) {
|
|
||||||
Ok(()) => Ok(Some(socket_fd)),
|
Ok(()) => Ok(Some(socket_fd)),
|
||||||
Err(errno) => Err(anyhow!("failed to open console fd: {}", errno)),
|
Err(errno) => Err(anyhow!("failed to open console fd: {}", errno)),
|
||||||
}
|
}
|
||||||
@ -36,11 +34,11 @@ pub fn setup_master_console(socket_fd: RawFd) -> Result<()> {
|
|||||||
let pseudo = pty::openpty(None, None)?;
|
let pseudo = pty::openpty(None, None)?;
|
||||||
|
|
||||||
let pty_name: &[u8] = b"/dev/ptmx";
|
let pty_name: &[u8] = b"/dev/ptmx";
|
||||||
let iov = [uio::IoVec::from_slice(pty_name)];
|
let iov = [IoSlice::new(pty_name)];
|
||||||
let fds = [pseudo.master];
|
let fds = [pseudo.master];
|
||||||
let cmsg = socket::ControlMessage::ScmRights(&fds);
|
let cmsg = socket::ControlMessage::ScmRights(&fds);
|
||||||
|
|
||||||
socket::sendmsg(socket_fd, &iov, &[cmsg], socket::MsgFlags::empty(), None)?;
|
socket::sendmsg::<()>(socket_fd, &iov, &[cmsg], socket::MsgFlags::empty(), None)?;
|
||||||
|
|
||||||
unistd::setsid()?;
|
unistd::setsid()?;
|
||||||
let ret = unsafe { libc::ioctl(pseudo.slave, libc::TIOCSCTTY) };
|
let ret = unsafe { libc::ioctl(pseudo.slave, libc::TIOCSCTTY) };
|
||||||
|
@ -390,8 +390,22 @@ impl AgentService {
|
|||||||
if p.init && sig == libc::SIGTERM && !is_signal_handled(&proc_status_file, sig as u32) {
|
if p.init && sig == libc::SIGTERM && !is_signal_handled(&proc_status_file, sig as u32) {
|
||||||
sig = libc::SIGKILL;
|
sig = libc::SIGKILL;
|
||||||
}
|
}
|
||||||
p.signal(sig)?;
|
|
||||||
}
|
match p.signal(sig) {
|
||||||
|
Err(Errno::ESRCH) => {
|
||||||
|
info!(
|
||||||
|
sl!(),
|
||||||
|
"signal encounter ESRCH, continue";
|
||||||
|
"container-id" => cid.clone(),
|
||||||
|
"exec-id" => eid.clone(),
|
||||||
|
"pid" => p.pid,
|
||||||
|
"signal" => sig,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
Err(err) => return Err(anyhow!(err)),
|
||||||
|
Ok(()) => (),
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if eid.is_empty() {
|
if eid.is_empty() {
|
||||||
// eid is empty, signal all the remaining processes in the container cgroup
|
// eid is empty, signal all the remaining processes in the container cgroup
|
||||||
|
Loading…
Reference in New Issue
Block a user