diff --git a/radicale/storage/multifilesystem/lock.py b/radicale/storage/multifilesystem/lock.py index 6382ec0b7..e5febd22b 100644 --- a/radicale/storage/multifilesystem/lock.py +++ b/radicale/storage/multifilesystem/lock.py @@ -20,6 +20,7 @@ import logging import os import shlex +import signal import subprocess from radicale import pathutils @@ -63,6 +64,7 @@ def acquire_lock(self, mode, user=None): # Use new process group for child to prevent terminals # from sending SIGINT etc. if os.name == "posix": + # Process group is also used to identify child processes popen_kwargs["preexec_fn"] = os.setpgrp elif os.name == "nt": popen_kwargs["creationflags"] = ( @@ -75,6 +77,11 @@ def acquire_lock(self, mode, user=None): except BaseException: # e.g. KeyboardInterrupt or SystemExit p.kill() raise + finally: + if os.name == "posix": + # Try to kill child processes + with contextlib.suppress(OSError): + os.killpg(p.pid, signal.SIGKILL) if stdout_data: logger.debug("Captured stdout hook:\n%s", stdout_data) if stderr_data: