Source code for meersolar.meerpipeline.kill_job

import psutil
import numpy as np
import argparse
import time
import sys
import os
import signal
from casatasks import casalog
from meersolar.utils import get_cachedir, drop_cache

try:
    casalogfile = casalog.logfile()
    os.system("rm -rf " + casalogfile)
except BaseException:
    pass


[docs] def kill_process_and_children(pid): try: parent = psutil.Process(pid) children = parent.children(recursive=True) for child in children: try: child.kill() except Exception: pass parent.kill() except (psutil.NoSuchProcess, ProcessLookupError): pass
[docs] def force_kill_pids_with_children(pids, max_tries=10, wait_time=0.5): """ Repeatedly try to kill all PIDs (and their children) until none remain. """ for attempt in range(max_tries): remaining = [] for pid in np.atleast_1d(pids): try: kill_process_and_children(int(pid)) except Exception: remaining.append(pid) time.sleep(wait_time) remaining = [pid for pid in np.atleast_1d(pids) if psutil.pid_exists(int(pid))] if not remaining: break else: pids = remaining
[docs] def kill_meerjob(): """ Kill MeerSOLAR Job """ parser = argparse.ArgumentParser(description="Kill MeerSOLAR Job") parser.add_argument( "--jobid", type=str, required=True, help="MeerSOLAR Job ID to kill" ) if len(sys.argv) == 1: parser.print_help(sys.stderr) sys.exit(1) args = parser.parse_args() cachedir = get_cachedir() jobfile_name = f"{cachedir}/main_pids_{args.jobid}.txt" results = np.loadtxt(jobfile_name, dtype="str", unpack=True) main_pid = int(results[1]) msname = str(results[2]) workdir = str(results[3]) outdir = str(results[4]) pid_file = f"{cachedir}/pids/pids_{args.jobid}.txt" try: os.kill(int(main_pid), signal.SIGKILL) except BaseException: pass if os.path.exists(pid_file): pids = np.loadtxt(pid_file, unpack=True, dtype="int") force_kill_pids_with_children(pids) os.system(f"rm -rf {workdir}/tmp_meersolar_*") drop_cache(msname) drop_cache(workdir) drop_cache(outdir) drop_cache(cachedir)
if __name__ == "__main__": kill_meerjob()