https://github.com/python/cpython/commit/55ecc0a40918ba0346bc83ef639b655b8a883645
commit: 55ecc0a40918ba0346bc83ef639b655b8a883645
branch: main
author: stratakis <[email protected]>
committer: vstinner <[email protected]>
date: 2026-09-23T12:01:48+02:00
summary:
gh-156722, test_dtrace: Terminate tracing processes gracefully on timeout
(#156753)
Send SIGTERM to the tracing process group before falling back to SIGKILL.
files:
M Lib/test/test_dtrace.py
diff --git a/Lib/test/test_dtrace.py b/Lib/test/test_dtrace.py
index 126e47a20cb7c6..946f6dc3a70a5c 100644
--- a/Lib/test/test_dtrace.py
+++ b/Lib/test/test_dtrace.py
@@ -84,21 +84,33 @@ def normalize_trace_output(output):
USE_PROCESS_GROUP = (hasattr(os, "setsid") and hasattr(os, "killpg"))
+TERMINATE_TIMEOUT = 10
def create_process_group(*args, **kwargs):
if USE_PROCESS_GROUP:
kwargs['start_new_session'] = True
return subprocess.Popen(*args, **kwargs)
-def kill_process_group(proc):
+def terminate_process_group(proc):
if USE_PROCESS_GROUP:
try:
- os.killpg(proc.pid, signal.SIGKILL)
+ os.killpg(proc.pid, signal.SIGTERM)
except ProcessLookupError:
pass
else:
- proc.kill()
- proc.communicate() # Clean up
+ proc.terminate()
+
+ try:
+ proc.communicate(timeout=TERMINATE_TIMEOUT)
+ except subprocess.TimeoutExpired:
+ if USE_PROCESS_GROUP:
+ try:
+ os.killpg(proc.pid, signal.SIGKILL)
+ except ProcessLookupError:
+ pass
+ else:
+ proc.kill()
+ proc.communicate(timeout=TERMINATE_TIMEOUT) # Clean up
def run_readelf(cmd):
@@ -163,7 +175,7 @@ def trace(self, script_file, subcommand=None, *,
timeout=None,
try:
stdout, _ = proc.communicate(timeout=timeout)
except subprocess.TimeoutExpired:
- kill_process_group(proc)
+ terminate_process_group(proc)
raise
if check_returncode and proc.returncode:
raise AssertionError(
@@ -361,7 +373,7 @@ def run_case(self, name, optimize_python=None):
)
stdout, stderr = proc.communicate(timeout=60)
except subprocess.TimeoutExpired:
- kill_process_group(proc)
+ terminate_process_group(proc)
raise AssertionError("bpftrace timed out")
except (FileNotFoundError, PermissionError) as e:
raise unittest.SkipTest(f"bpftrace not available: {e}")
@@ -400,7 +412,7 @@ def assert_usable(self):
)
stdout, stderr = proc.communicate(timeout=10)
except subprocess.TimeoutExpired:
- kill_process_group(proc)
+ terminate_process_group(proc)
raise unittest.SkipTest("bpftrace timed out during usability
check")
except OSError as e:
raise unittest.SkipTest(f"bpftrace not available: {e}")
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]