diff --git a/lib/galaxy/jobs/runners/local.py b/lib/galaxy/jobs/runners/local.py index 1730ecd4e80..4903dcad37a 100644 --- a/lib/galaxy/jobs/runners/local.py +++ b/lib/galaxy/jobs/runners/local.py @@ -5,6 +5,7 @@ import datetime import errno import logging import os +import signal import subprocess import tempfile import threading @@ -92,6 +93,10 @@ class LocalJobRunner(BaseJobRunner): stdout_file = tempfile.NamedTemporaryFile(mode='wb+', suffix='_stdout', dir=job_wrapper.working_directory) stderr_file = tempfile.NamedTemporaryFile(mode='wb+', suffix='_stderr', dir=job_wrapper.working_directory) log.debug('(%s) executing job script: %s' % (job_id, command_line)) + # The preexec_fn argument of Popen() is used to call os.setpgrp() in + # the child process just before the child is executed. This will set + # the PGID of the child process to its PID (i.e. ensures that it is + # the root of its own process group instead of Galaxy's one). proc = subprocess.Popen(args=command_line, shell=True, cwd=job_wrapper.working_directory, @@ -161,7 +166,7 @@ class LocalJobRunner(BaseJobRunner): if not self._check_pid(pid): log.warning("stop_job(): %s: PID %d was already dead or can't be signaled" % (job.id, pid)) return - for sig in [15, 9]: + for sig in [signal.SIGTERM, signal.SIGKILL]: try: os.killpg(pid, sig) except OSError as e: @@ -216,10 +221,10 @@ class LocalJobRunner(BaseJobRunner): return False def _terminate(self, proc): - os.killpg(proc.pid, 15) + os.killpg(proc.pid, signal.SIGTERM) sleep(1) if proc.poll() is None: - os.killpg(proc.pid, 9) + os.killpg(proc.pid, signal.SIGKILL) return proc.wait() # reap def _handle_container(self, job_wrapper, proc): diff --git a/lib/galaxy/jobs/runners/util/__init__.py b/lib/galaxy/jobs/runners/util/__init__.py index 6f204e8d814..47b67683abe 100644 --- a/lib/galaxy/jobs/runners/util/__init__.py +++ b/lib/galaxy/jobs/runners/util/__init__.py @@ -3,7 +3,8 @@ This module and its submodules contains utilities for running external processes and interfacing with job managers. This module should contain functionality shared between Galaxy and the Pulsar. """ -from galaxy.util.bunch import Bunch from .kill import kill_pid -__all__ = ('kill_pid', 'Bunch') +__all__ = ( + 'kill_pid', +) diff --git a/lib/galaxy/jobs/runners/util/cli/shell/local.py b/lib/galaxy/jobs/runners/util/cli/shell/local.py index 2e2f86c17f5..5ab215b9be6 100644 --- a/lib/galaxy/jobs/runners/util/cli/shell/local.py +++ b/lib/galaxy/jobs/runners/util/cli/shell/local.py @@ -8,11 +8,9 @@ from time import sleep import six -from ..shell import BaseShellExec -from ....util import ( - Bunch, - kill_pid -) +from galaxy.util.bunch import Bunch +from . import BaseShellExec +from ....util import kill_pid log = getLogger(__name__) diff --git a/lib/galaxy/jobs/runners/util/kill.py b/lib/galaxy/jobs/runners/util/kill.py index a95d7e0b51c..6b4e3f8854d 100644 --- a/lib/galaxy/jobs/runners/util/kill.py +++ b/lib/galaxy/jobs/runners/util/kill.py @@ -1,4 +1,5 @@ import os +import signal import subprocess from platform import system from time import sleep @@ -55,7 +56,7 @@ def __kill_posix(pid): return False if __check_pid(): - for sig in [15, 9]: + for sig in [signal.SIGTERM, signal.SIGKILL]: try: os.killpg(pid, sig) except OSError: