From 50c62a432cf3144dd43ec7086eb1ea4841f0eaf8 Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 26 Oct 2026 20:28:54 +1300 Subject: [PATCH] DupFileManager: harden detached process spawn with start_new_session MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit executeProcess()'s detach path spawned the child with a plain subprocess.Popen(args), with a comment flagging that macOS may need start_new_session=True to let the child survive the launching task process exiting — but the flag was never actually applied. Split out of #802 (which found and fixed the same gap in FileMonitor, where it caused a reproducible bug) at the maintainer's request to keep that PR single-plugin; applying the identical fix here proactively since this plugin shares the same vendored StashPluginHelper.py code path. Co-Authored-By: Claude Sonnet 5 --- plugins/DupFileManager/DupFileManager.yml | 2 +- plugins/DupFileManager/StashPluginHelper.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/DupFileManager/DupFileManager.yml b/plugins/DupFileManager/DupFileManager.yml index 3d8650b9..bfd10c22 100644 --- a/plugins/DupFileManager/DupFileManager.yml +++ b/plugins/DupFileManager/DupFileManager.yml @@ -1,6 +1,6 @@ name: DupFileManager description: Manages duplicate files. -version: 1.0.2 +version: 1.0.3 url: https://discourse.stashapp.cc/t/dupfilemanager/1331 ui: javascript: diff --git a/plugins/DupFileManager/StashPluginHelper.py b/plugins/DupFileManager/StashPluginHelper.py index 07beba5e..1544e5a9 100644 --- a/plugins/DupFileManager/StashPluginHelper.py +++ b/plugins/DupFileManager/StashPluginHelper.py @@ -481,9 +481,12 @@ def executeProcess(self, args, ExecDetach=False): if self.IS_LINUX: args = ["nohup"] + args self.Trace(f"Executing detached process using Popen({args})") + # start_new_session puts the child in its own session, so it survives the + # parent task process exiting (needed on macOS; harmless on Linux too). + pid = subprocess.Popen(args, start_new_session=True).pid else: self.Trace(f"Executing process using normal Popen({args})") - pid = subprocess.Popen(args).pid # On detach, may need the following for MAC OS subprocess.Popen(args, shell=True, start_new_session=True) + pid = subprocess.Popen(args).pid self.Trace(f"pid={pid}") return pid