Warning
This document is for an old release 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)