Warning
This document is for an in-development version of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.jobs.runners.util.process_groups
import errno
import logging
import os
import signal
from time import sleep
log = logging.getLogger(__name__)
[docs]def check_pg(pgid):
"""Check whether processes in process group pgid are still alive."""
try:
(pid, exit_status) = os.waitpid(-pgid, os.WNOHANG)
except OSError as e:
if e.errno == errno.ECHILD:
log.debug("check_pg(): No process found in process group %d", pgid)
else:
log.warning("check_pg(): Got errno %s when checking process group %d: %s", errno.errorcode[e.errno], pgid, e.strerror)
return False
# Since we are passing os.WNOHANG to os.waitpid(), pid is 0 if no process
# status is available immediately.
return pid == 0
[docs]def kill_pg(pgid):
"""Kill all processes in process group pgid."""
for sig in [signal.SIGTERM, signal.SIGKILL]:
try:
os.killpg(pgid, sig)
except OSError as e:
if e.errno == errno.ESRCH:
return
log.warning("Got errno %s when sending signal %d to process group %d: %s", errno.errorcode[e.errno], sig, pgid, e.strerror)
sleep(1)
if not check_pg(pgid):
log.debug("Processes in process group %d successfully killed with signal %d", pgid, sig)
return
else:
log.warning("Some process in process group %d refuses to die after signaling TERM/KILL", pgid)