agent: fix the issue of exec hang with a backgroud process

When run a exec process in backgroud without tty, the
exec will hang and didn't terminated.

For example:

crictl -i <container id> sh -c 'nohup tail -f /dev/null &'

Fixes: #4747

Signed-off-by: Fupan Li <fupan.lfp@antgroup.com>
This commit is contained in:
Fupan Li 2022-07-26 15:50:35 +08:00 committed by fupan
parent 5231aff90f
commit 25d2fb0fde
2 changed files with 4 additions and 3 deletions

View File

@ -161,7 +161,7 @@ impl Process {
pub fn notify_term_close(&mut self) { pub fn notify_term_close(&mut self) {
let notify = self.term_exit_notifier.clone(); let notify = self.term_exit_notifier.clone();
notify.notify_one(); notify.notify_waiters();
} }
pub fn close_stdin(&mut self) { pub fn close_stdin(&mut self) {

View File

@ -603,15 +603,16 @@ impl AgentService {
let cid = req.container_id; let cid = req.container_id;
let eid = req.exec_id; let eid = req.exec_id;
let mut term_exit_notifier = Arc::new(tokio::sync::Notify::new()); let term_exit_notifier;
let reader = { let reader = {
let s = self.sandbox.clone(); let s = self.sandbox.clone();
let mut sandbox = s.lock().await; let mut sandbox = s.lock().await;
let p = sandbox.find_container_process(cid.as_str(), eid.as_str())?; let p = sandbox.find_container_process(cid.as_str(), eid.as_str())?;
term_exit_notifier = p.term_exit_notifier.clone();
if p.term_master.is_some() { if p.term_master.is_some() {
term_exit_notifier = p.term_exit_notifier.clone();
p.get_reader(StreamType::TermMaster) p.get_reader(StreamType::TermMaster)
} else if stdout { } else if stdout {
if p.parent_stdout.is_some() { if p.parent_stdout.is_some() {