Try to kill child processes of storage hook

This commit is contained in:
Unrud 2020-08-31 13:54:49 +02:00
parent 1e011e7011
commit 2851525e15

View File

@ -20,6 +20,7 @@ import contextlib
import logging import logging
import os import os
import shlex import shlex
import signal
import subprocess import subprocess
from radicale import pathutils from radicale import pathutils
@ -63,6 +64,7 @@ class StorageLockMixin:
# Use new process group for child to prevent terminals # Use new process group for child to prevent terminals
# from sending SIGINT etc. # from sending SIGINT etc.
if os.name == "posix": if os.name == "posix":
# Process group is also used to identify child processes
popen_kwargs["preexec_fn"] = os.setpgrp popen_kwargs["preexec_fn"] = os.setpgrp
elif os.name == "nt": elif os.name == "nt":
popen_kwargs["creationflags"] = ( popen_kwargs["creationflags"] = (
@ -75,6 +77,11 @@ class StorageLockMixin:
except BaseException: # e.g. KeyboardInterrupt or SystemExit except BaseException: # e.g. KeyboardInterrupt or SystemExit
p.kill() p.kill()
raise raise
finally:
if os.name == "posix":
# Try to kill child processes
with contextlib.suppress(OSError):
os.killpg(p.pid, signal.SIGKILL)
if stdout_data: if stdout_data:
logger.debug("Captured stdout hook:\n%s", stdout_data) logger.debug("Captured stdout hook:\n%s", stdout_data)
if stderr_data: if stderr_data: