diff --git a/lidar_pipeline/cli.py b/lidar_pipeline/cli.py index f481c47..cbe0e72 100644 --- a/lidar_pipeline/cli.py +++ b/lidar_pipeline/cli.py @@ -15,6 +15,10 @@ from .gpu import log_gpu_status logger = logging.getLogger("lidar") +# Motif pkill des processus PDAL de CE run (renseigné dans main) — cf. +# _kill_orphan_pdal : borné à notre output pour épargner les autres runs. +_pdal_kill_pattern = None + def setup_logging(verbose=False, debug=False): """Configure the 'lidar' logger. @@ -273,11 +277,15 @@ def main(): from .gpu import restrict_gpus restrict_gpus(gpu_ids) - # Kill orphan PDAL processes on interrupt or termination + # Kill orphan PDAL processes on interrupt or termination. Le motif est + # borné à NOTRE répertoire temporaire (pdal pipeline /temp/…) : un + # pkill global massacrerient les PDAL des autres runs de la machine (ex. + # job webapp concurrent). Pas de hook atexit : une sortie normale n'a + # aucune raison de tuer quoi que ce soit. + global _pdal_kill_pattern + _pdal_kill_pattern = f"pdal pipeline {args.output}/temp/" signal.signal(signal.SIGINT, _kill_orphan_pdal) signal.signal(signal.SIGTERM, _kill_orphan_pdal) - import atexit - atexit.register(_kill_orphan_pdal) log_gpu_status() @@ -394,14 +402,19 @@ def main(): def _kill_orphan_pdal(signum=None, frame=None): - """Kill orphan PDAL processes on interrupt or exit.""" + """Kill orphan PDAL processes of THIS run on interrupt or termination.""" import subprocess # Belt-and-suspenders: os.killpg below is the primary mechanism. # This handles the edge case where a child escapes the process group. - try: - subprocess.run(["pkill", "-9", "-f", "pdal pipeline"], capture_output=True, timeout=3) - except Exception: - pass + # Motif borné à notre output (cf. main) pour ne pas tuer les PDAL des + # autres runs de la machine. + if _pdal_kill_pattern: + try: + import re + subprocess.run(["pkill", "-9", "-f", re.escape(_pdal_kill_pattern)], + capture_output=True, timeout=3) + except Exception: + pass if signum is not None: logger.info("Interruption — nettoyage des processus") # Force-kill all child processes immediately