@@ -84,21 +84,33 @@ def normalize_trace_output(output):
8484
8585
8686USE_PROCESS_GROUP = (hasattr (os , "setsid" ) and hasattr (os , "killpg" ))
87+ TERMINATE_TIMEOUT = 10
8788
8889def create_process_group (* args , ** kwargs ):
8990 if USE_PROCESS_GROUP :
9091 kwargs ['start_new_session' ] = True
9192 return subprocess .Popen (* args , ** kwargs )
9293
93- def kill_process_group (proc ):
94+ def terminate_process_group (proc ):
9495 if USE_PROCESS_GROUP :
9596 try :
96- os .killpg (proc .pid , signal .SIGKILL )
97+ os .killpg (proc .pid , signal .SIGTERM )
9798 except ProcessLookupError :
9899 pass
99100 else :
100- proc .kill ()
101- proc .communicate () # Clean up
101+ proc .terminate ()
102+
103+ try :
104+ proc .communicate (timeout = TERMINATE_TIMEOUT )
105+ except subprocess .TimeoutExpired :
106+ if USE_PROCESS_GROUP :
107+ try :
108+ os .killpg (proc .pid , signal .SIGKILL )
109+ except ProcessLookupError :
110+ pass
111+ else :
112+ proc .kill ()
113+ proc .communicate (timeout = TERMINATE_TIMEOUT ) # Clean up
102114
103115
104116def run_readelf (cmd ):
@@ -163,7 +175,7 @@ def trace(self, script_file, subcommand=None, *, timeout=None,
163175 try :
164176 stdout , _ = proc .communicate (timeout = timeout )
165177 except subprocess .TimeoutExpired :
166- kill_process_group (proc )
178+ terminate_process_group (proc )
167179 raise
168180 if check_returncode and proc .returncode :
169181 raise AssertionError (
@@ -361,7 +373,7 @@ def run_case(self, name, optimize_python=None):
361373 )
362374 stdout , stderr = proc .communicate (timeout = 60 )
363375 except subprocess .TimeoutExpired :
364- kill_process_group (proc )
376+ terminate_process_group (proc )
365377 raise AssertionError ("bpftrace timed out" )
366378 except (FileNotFoundError , PermissionError ) as e :
367379 raise unittest .SkipTest (f"bpftrace not available: { e } " )
@@ -400,7 +412,7 @@ def assert_usable(self):
400412 )
401413 stdout , stderr = proc .communicate (timeout = 10 )
402414 except subprocess .TimeoutExpired :
403- kill_process_group (proc )
415+ terminate_process_group (proc )
404416 raise unittest .SkipTest ("bpftrace timed out during usability check" )
405417 except OSError as e :
406418 raise unittest .SkipTest (f"bpftrace not available: { e } " )
0 commit comments