From 6043197d72eeaab086be2eacdc16a017b5c5c39b Mon Sep 17 00:00:00 2001 From: dsutanto Date: Wed, 5 Aug 2026 10:29:41 +0700 Subject: [PATCH] Fix recount stop: kill whole process group, not just shell --- recounting_dashboard_upload.py | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/recounting_dashboard_upload.py b/recounting_dashboard_upload.py index e6487c3..5e30a56 100644 --- a/recounting_dashboard_upload.py +++ b/recounting_dashboard_upload.py @@ -8,6 +8,7 @@ import logging import os import re import shlex +import signal import subprocess import threading import time @@ -74,13 +75,31 @@ def _api_get(base_url, path, default=None): def _stop_recount_locked(): global _recount_proc - if _recount_proc: + proc = _recount_proc + _recount_proc = None + if proc is None: + return + try: + pgid = os.getpgid(proc.pid) + except (ProcessLookupError, PermissionError): + return + try: + os.killpg(pgid, signal.SIGTERM) + except (ProcessLookupError, PermissionError): + pass + try: + proc.wait(timeout=5) + except subprocess.TimeoutExpired: try: - _recount_proc.kill() - _recount_proc.wait(timeout=3) + os.killpg(pgid, signal.SIGKILL) + except (ProcessLookupError, PermissionError): + pass + try: + proc.wait(timeout=3) except Exception: pass - _recount_proc = None + except Exception: + pass def _folder_date(filepath, base): @@ -179,7 +198,7 @@ def start_recount(): _current_file = upload_path cmd_str = RECOUNT_CMD.replace("{path}", shlex.quote(str(upload_path))) try: - _recount_proc = subprocess.Popen(cmd_str, shell=True) + _recount_proc = subprocess.Popen(cmd_str, shell=True, start_new_session=True) print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Recount started: {cmd_str}") except Exception as e: _current_file = None