def ejobs(args, bjobsargs): """Wrapper script with bjobs functionality.""" # handle arguments if args.pending: bjobsargs = ["-p"] + bjobsargs args.groupby = "pend_reason" for shortcutname, shortcutargs in ejobsshortcuts.items(): if getattr(args, shortcutname): bjobsargs = shortcutargs + bjobsargs for l in list("rsda"): if args.__dict__[l]: bjobsargs = ["-" + l] + bjobsargs if args.u: unames = map(lookupalias, args.u.split()) bjobsargs = ["-u", " ".join(unames)] + bjobsargs if args.jid: args.output = ["id"] args.fast = True args.noheader = True if args.output: args.output = sum([fields.split() for fields in args.output], []) if len(args.output) == 1: args.noheader = True # read jobs = readjobs(bjobsargs, fast=args.fast) if not jobs: return # sort jobs.sort(key=lambda j: j["submit_time"]) jobs.sort(key=lambda j: j["priority"], reverse=True) # can be None jobs.sort(key=lambda j: -j["run_time"]) jobs.sort(key=lambda j: -statorder[j["stat"]]) if args.sort: try: jobs.sort(key=lambda j: j[args.sort]) except: print("Unknown sorting key \"%s\"!" % args.sort, file=sys.stderr) # no grouping if not args.groupby or args.groupby not in jobs[0]: if args.sum: jobs = [sumjobs(jobs)] printjobs(jobs, wide=args.wide, long=args.long, output=args.output, header=not args.noheader) return # grouping jobgroups = groupjobs(jobs, args.groupby) if not args.pending: if args.sum: jobs = [] for title in sorted(jobgroups.keys()): sumjob = sumjobs(jobgroups[title]) if args.groupby not in ("name", "jobname", "user"): sumjob["title"] = title jobs.append(sumjob) printjobs(jobs, wide=args.wide, long=args.long, output=args.output, header=not args.noheader) else: for title in sorted(jobgroups.keys()): printjobs(jobgroups[title], wide=args.wide, long=args.long, output=args.output, header=not args.noheader, title=title) return # pending for title in sorted(jobgroups.keys()): jobs = jobgroups[title] reasons = jobs[0]["pend_reason"] resreq = jobs[0]["resreq"] hostreq = jobs[0]["host_req"] if not reasons or len(reasons) != 1: title = None else: # use singular reason as title reason = reasons[0] title = reason[0] if not isinstance(reason[1], bool): title += ": %d" % reason[1] if args.sum: jobs = [sumjobs(jobs)] printjobs(jobs, wide=args.wide, long=args.long, output=args.output, header=not args.noheader, title=title) if reasons and len(reasons) > 1: # show pending reasons for reason, count in reasons: for pattern in pendingcolors: if re.match(pattern, reason): reason = color(reason, pendingcolors[pattern]) break if count is True: print(" " + reason) else: print(" %4d %s" % (count, reason)) # show potential hosts if resreq and not args.fast: resreq = re.sub(" && \(hostok\)", "", resreq) resreq = re.sub(" && \(mem>\d+\)", "", resreq) hosts = readhosts(["-R", resreq] + hostreq) hostnames = [h["host_name"] for h in hosts] jobs = readjobs(["-u", "all", "-r", "-m", " ".join(hostnames)]) hosts.sort(key=lambda h: h["host_name"]) printhosts(hosts, jobs, wide=args.wide, header=not args.noheader) if len(jobgroups) > 1: print()
def ejobs(args, bjobsargs): """Wrapper script with bjobs functionality.""" # handle arguments if args.pending: bjobsargs = ["-p"] + bjobsargs args.groupby = "pend_reason" for shortcutname, shortcutargs in ejobsshortcuts.items(): if getattr(args, shortcutname): bjobsargs = shortcutargs + bjobsargs for l in list("rsda"): if args.__dict__[l]: bjobsargs = ["-" + l] + bjobsargs if args.u: unames = map(lookupalias, args.u.split()) bjobsargs = ["-u", " ".join(unames)] + bjobsargs if args.jid: args.output = ["id"] args.fast = True args.noheader = True if args.output: args.output = sum([fields.split() for fields in args.output], []) if len(args.output) == 1: args.noheader = True # read jobs = readjobs(bjobsargs, fast=args.fast) if not jobs: return # sort jobs.sort(key=lambda j: j["submit_time"]) jobs.sort(key=lambda j: j["priority"], reverse=True) # can be None jobs.sort(key=lambda j: -j["run_time"]) jobs.sort(key=lambda j: -statorder[j["stat"]]) if args.sort: try: jobs.sort(key=lambda j: j[args.sort]) except: print("Unknown sorting key \"%s\"!" % args.sort, file=sys.stderr) # no grouping if not args.groupby or args.groupby not in jobs[0]: if args.sum: jobs = [sumjobs(jobs)] printjobs(jobs, wide=args.wide, long=args.long, output=args.output, header=not args.noheader) return # grouping jobgroups = groupjobs(jobs, args.groupby) if not args.pending: if args.sum: jobs = [] for title in sorted(jobgroups.keys()): sumjob = sumjobs(jobgroups[title]) if args.groupby not in ("name", "jobname", "user"): sumjob["title"] = title jobs.append(sumjob) printjobs(jobs, wide=args.wide, long=args.long, output=args.output, header=not args.noheader) else: for title in sorted(jobgroups.keys()): printjobs(jobgroups[title], wide=args.wide, long=args.long, output=args.output, header=not args.noheader, title=title) return # pending for title in sorted(jobgroups.keys()): jobs = jobgroups[title] reasons = jobs[0]["pend_reason"] resreq = jobs[0]["resreq"] hostreq = jobs[0]["host_req"] if not reasons or len(reasons) != 1: title = None else: # use singular reason as title reason = reasons[0] title = reason[0] if not isinstance(reason[1], bool): title += ": %d" % reason[1] if args.sum: jobs = [sumjobs(jobs)] printjobs(jobs, wide=args.wide, long=args.long, output=args.output, header=not args.noheader, title=title) if reasons and len(reasons) > 1: # show pending reasons for reason, count in reasons: for pattern in pendingcolors: if re.match(pattern, reason): reason = color(reason, pendingcolors[pattern]) break if count is True: print(" " + reason) else: print(" %4d %s" % (count, reason)) # show potential hosts if resreq and not args.fast: resreq = re.sub(" && \(hostok\)", "", resreq) resreq = re.sub(" && \(mem>\d+\)", "", resreq) hosts = readhosts(["-R", resreq] + hostreq) hostnames = [h["host_name"] for h in hosts] jobs = readjobs(["-u", "all", "-r", "-m", " ".join(hostnames)]) hosts.sort(key=lambda h: h["host_name"]) printhosts(hosts, jobs, wide=args.wide, header=not args.noheader) if len(jobgroups) > 1: print()
def main(): """Main program entry point.""" # argument parser and options parser = argparse.ArgumentParser( description="More comprehensive version of bjobs." ) exg = parser.add_mutually_exclusive_group() exg.add_argument( "-w", "--wide", help="show more detailed (wide) info", action="store_true" ) exg.add_argument( "-l", "--long", help="long job description", action="store_true" ) exg.add_argument( "-o", "--output", help="show value of FIELD", action="append", metavar="FIELD" ) parser.add_argument( "--sum", help="summarize across jobs", action="store_true" ) exg = parser.add_mutually_exclusive_group() exg.add_argument( "-p", "--pending", help="show pending jobs with reasons and potential hosts", action="store_true" ) exg.add_argument( "--groupby", help="group jobs by KEY", metavar="KEY" ) parser.add_argument( "--sort", help="sort jobs by KEY", metavar="KEY", nargs="?", const="id" ) parser.add_argument( "--fast", help="read less info from LSF", action="store_true" ) parser.add_argument( "--noheader", help="don't show the header", action="store_true" ) # shortcuts shortcuts = parser.add_argument_group("shortcuts") shortcuts.add_argument( "--jid", help="for \"-o id --noheader\"", action="store_true" ) for shortcutname, shortcutargs in ejobsshortcuts.items(): shortcuts.add_argument( "-" + shortcutname, help="for \"%s\"" % " ".join(shortcutargs), action="store_true" ) # hide or discard some arguments parser.add_argument( "-X", # discard help=argparse.SUPPRESS, action="store_true" ) parser.add_argument( "-u", # for username lookup help=argparse.SUPPRESS, ) # pass the following on to allow combining (e.g. with -p or -l) for l in list("rsda"): parser.add_argument( "-" + l, help=argparse.SUPPRESS, action="store_true" ) # bjobs arguments hint parser.add_argument_group( "further arguments", description="are passed to bjobs" ) # parse arguments args, bjobsargs = parser.parse_known_args() # run ejobs try: ejobs(args, bjobsargs) except (KeyboardInterrupt, IOError): pass
def main(): """Main program entry point.""" # argument parser and options parser = argparse.ArgumentParser( description="More comprehensive version of bjobs.") exg = parser.add_mutually_exclusive_group() exg.add_argument("-w", "--wide", help="show more detailed (wide) info", action="store_true") exg.add_argument("-l", "--long", help="long job description", action="store_true") exg.add_argument("-o", "--output", help="show value of FIELD", action="append", metavar="FIELD") parser.add_argument("--sum", help="summarize across jobs", action="store_true") exg = parser.add_mutually_exclusive_group() exg.add_argument("-p", "--pending", help="show pending jobs with reasons and potential hosts", action="store_true") exg.add_argument("--groupby", help="group jobs by KEY", metavar="KEY") parser.add_argument("--sort", help="sort jobs by KEY", metavar="KEY", nargs="?", const="id") parser.add_argument("--fast", help="read less info from LSF", action="store_true") parser.add_argument("--noheader", help="don't show the header", action="store_true") # shortcuts shortcuts = parser.add_argument_group("shortcuts") shortcuts.add_argument("--jid", help="for \"-o id --noheader\"", action="store_true") for shortcutname, shortcutargs in ejobsshortcuts.items(): shortcuts.add_argument("-" + shortcutname, help="for \"%s\"" % " ".join(shortcutargs), action="store_true") # hide or discard some arguments parser.add_argument( "-X", # discard help=argparse.SUPPRESS, action="store_true") parser.add_argument( "-u", # for username lookup help=argparse.SUPPRESS, ) # pass the following on to allow combining (e.g. with -p or -l) for l in list("rsda"): parser.add_argument("-" + l, help=argparse.SUPPRESS, action="store_true") # bjobs arguments hint parser.add_argument_group("further arguments", description="are passed to bjobs") # parse arguments args, bjobsargs = parser.parse_known_args() # run ejobs try: ejobs(args, bjobsargs) except (KeyboardInterrupt, IOError): pass