File indexing completed on 2026-04-10 08:39:07
0001 import optparse
0002 import sys
0003
0004
0005 from pandaserver.config import panda_config
0006 from pandaserver.taskbuffer.OraDBProxy import DBProxy
0007 from pandaserver.userinterface import Client
0008
0009 option_parser = optparse.OptionParser(conflict_handler="resolve")
0010 option_parser.add_option("--user", action="store", dest="user", default=None, help="prodUserName")
0011 option_parser.add_option("--jobID", action="store", dest="jobID", default=None, help="jobDefinitionID")
0012 option_parser.add_option(
0013 "--jobsetID",
0014 action="store",
0015 dest="jobsetID",
0016 default=None,
0017 help="jobsetID, or 'all' to kill all jobs",
0018 )
0019 option_parser.add_option(
0020 "--prodSourceLabel",
0021 action="store",
0022 dest="prodSourceLabel",
0023 default=None,
0024 help="additional prodSourceLabel",
0025 )
0026
0027
0028 options, args = option_parser.parse_args()
0029
0030 if options.user is None:
0031 print("--user=<prodUserName> is required")
0032 sys.exit(1)
0033 if options.jobID is None and options.jobsetID is None:
0034 print("--jobID=<jobDefinitionID> or --jobsetID=<jobsetID or 'all'> is required")
0035 sys.exit(1)
0036
0037
0038 proxyS = DBProxy()
0039 proxyS.connect(panda_config.dbhost, panda_config.dbpasswd, panda_config.dbuser, panda_config.dbname)
0040
0041 prodUserName = sys.argv[1]
0042
0043 varMap = {}
0044 varMap[":src1"] = "user"
0045 varMap[":src2"] = "panda"
0046 varMap[":prodUserName"] = options.user
0047 srcSQL = "(:src1,:src2"
0048 if options.jobID is not None:
0049 varMap[":jobDefinitionID"] = options.jobID
0050 if options.jobsetID not in (None, "all"):
0051 varMap[":jobsetID"] = options.jobsetID
0052 if options.prodSourceLabel is not None:
0053 varMap[":src3"] = options.prodSourceLabel
0054 srcSQL += ",:src3"
0055 srcSQL += ")"
0056
0057 jobs = []
0058 tables = [
0059 "ATLAS_PANDA.jobsActive4",
0060 "ATLAS_PANDA.jobsDefined4",
0061 ]
0062 for table in tables:
0063 sql = f"SELECT PandaID FROM {table} WHERE prodUserName=:prodUserName AND prodSourceLabel IN {srcSQL} "
0064 if options.jobID is not None:
0065 sql += "AND jobDefinitionID=:jobDefinitionID "
0066 if options.jobsetID not in (None, "all"):
0067 sql += "AND jobsetID=:jobsetID "
0068 sql += "ORDER BY PandaID "
0069 status, res = proxyS.querySQLS(sql, varMap)
0070 if res is not None:
0071 for (id,) in res:
0072 if id not in jobs:
0073 jobs.append(id)
0074 if len(jobs):
0075 iJob = 0
0076 nJob = 1000
0077 while iJob < len(jobs):
0078 subJobs = jobs[iJob : iJob + nJob]
0079 print(f"kill {str(subJobs)} {iJob}/{len(jobs)}")
0080 Client.kill_jobs(subJobs, code=9)
0081 iJob += nJob
0082 else:
0083 print("no job was killed")