11use std:: {
22 fs,
33 io:: { BufRead , BufReader } ,
4+ os:: unix:: process:: CommandExt ,
45 path:: Path ,
56 process:: { Command , Stdio } ,
67 sync:: mpsc,
@@ -9,6 +10,7 @@ use std::{
910} ;
1011
1112use anyhow:: * ;
13+ use nix:: sys:: { prctl:: set_pdeathsig, signal:: Signal } ;
1214use signal_hook:: { consts:: signal:: SIGTERM , iterator:: Signals } ;
1315
1416use crate :: { log_shipper, throttle, MAX_LINE_BYTES } ;
@@ -68,15 +70,25 @@ pub fn run(
6870 actor_id,
6971 fs_path. display( )
7072 ) ;
71- let mut runc_child = Command :: new ( "runc" )
73+
74+ let mut runc_child = Command :: new ( "runc" ) ;
75+ let runc_child = runc_child
7276 . arg ( "run" )
7377 . arg ( & actor_id)
7478 . arg ( "-b" )
7579 . arg ( fs_path)
7680 . stdout ( Stdio :: piped ( ) )
77- . stderr ( Stdio :: piped ( ) )
78- . spawn ( )
79- . expect ( "failed to spawn runc" ) ;
81+ . stderr ( Stdio :: piped ( ) ) ;
82+
83+ let runc_child = unsafe {
84+ runc_child. pre_exec ( || {
85+ // Set the child to receive SIGKILL when parent dies
86+ set_pdeathsig ( Signal :: SIGKILL )
87+ . map_err ( |err| std:: io:: Error :: new ( std:: io:: ErrorKind :: Other , err) )
88+ } )
89+ } ;
90+
91+ let mut runc_child = runc_child. spawn ( ) . expect ( "failed to spawn runc" ) ;
8092 let runc_stdout = BufReader :: new ( runc_child. stdout . take ( ) . unwrap ( ) ) ;
8193 let runc_stderr = BufReader :: new ( runc_child. stderr . take ( ) . unwrap ( ) ) ;
8294
0 commit comments