Source code for matador.compute.pbs

# coding: utf-8
# Distributed under the terms of the MIT License.

""" This file implements a simple interface to basic PBS
functionality, mostly for monitoring walltime of jobs submitted
via PBS.

"""

from matador.compute.queueing import QueueManager


[docs]class PBSQueueManager(QueueManager): """Wrapper for the PBS queueing system.""" token = "pbs"
[docs] def get_ntasks(self): return int(self.env["PBS_TASKNUM"])
[docs] def get_max_memory(self): return None
[docs] def get_array_id(self): if self.env.get("PBS_ARRAYID") is not None: return int(self.env["PBS_ARRAYID"]) return None
[docs] def get_walltime(self): """Query available walltime with qstat on the current job. Parameters: pbs_dict (dict): pbs env parameters to query. Raises: RuntimeError: if PBS_JOBID not present in slurm env. subprocess.CalledProcessError: if unable to use qstat. Returns: int: maximum allowed walltime time in seconds. """ import subprocess as sp pbs_dict = self.env job_id = pbs_dict.get("PBS_JOBID") if job_id is not None: output = ( sp.check_output("qstat -f {}".format(job_id), shell=True) .decode("utf-8") .split("\n") ) output_dict = { line.strip() .split("=")[0] .strip(): " ".join(line.strip().split("=")[1:]) .strip() for line in output if "=" in line } walltime = output_dict.get("Resource_List.walltime") hrs = 0 if "-" in walltime: days = int(walltime.split("-")[0]) walltime = walltime.split("-")[1] hrs += days * 24 hrs += int(walltime.split(":")[0]) mins = int(walltime.split(":")[1]) secs = int(walltime.split(":")[2]) walltime_in_seconds = (60 * hrs + mins) * 60 + secs return walltime_in_seconds