@@ -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 (
@@ -350,7 +362,7 @@ def run_case(self, name, optimize_python=None):
350362 )
351363 stdout , stderr = proc .communicate (timeout = 60 )
352364 except subprocess .TimeoutExpired :
353- kill_process_group (proc )
365+ terminate_process_group (proc )
354366 raise AssertionError ("bpftrace timed out" )
355367 except (FileNotFoundError , PermissionError ) as e :
356368 raise unittest .SkipTest (f"bpftrace not available: { e } " )
@@ -389,7 +401,7 @@ def assert_usable(self):
389401 )
390402 stdout , stderr = proc .communicate (timeout = 10 )
391403 except subprocess .TimeoutExpired :
392- kill_process_group (proc )
404+ terminate_process_group (proc )
393405 raise unittest .SkipTest ("bpftrace timed out during usability check" )
394406 except OSError as e :
395407 raise unittest .SkipTest (f"bpftrace not available: { e } " )
0 commit comments