Source code for esub.scripts.send_cmd
# Copyright (C) 2019 ETH Zurich,
# Institute for Particle Physics and Astrophysics
# Author: Joerg Herbel
import argparse
import os
import shlex
import subprocess
from ekit import logger as logger_utils
LOGGER = logger_utils.init_logger(__name__)
[docs]def get_job_ids(path_log):
# Read file
with open(path_log, "r") as f:
lines = f.readlines()
# Find job ids
job_ids = []
for line in lines:
if "Job id" in line:
job_id = ""
line = line.strip()
i = len(line) - 1
while line[i].isdigit():
job_id = line[i] + job_id
i -= 1
job_ids.append(job_id)
return job_ids
[docs]def send_to_job(cmd, job_id):
full_cmd = "{} {}".format(cmd, job_id)
subprocess.call(shlex.split(full_cmd))
[docs]def main(dirpath_logs, cmd, log_filter=None):
# Get all log files in directory
filenames_logs = filter(
lambda fn: not fn.startswith(".") and os.path.splitext(fn)[1] == ".log",
os.listdir(dirpath_logs),
)
# Filter files
if log_filter is not None:
filenames_logs = filter(lambda fn: log_filter in fn, filenames_logs)
# Extract job ids from files
job_ids = []
for filename in filenames_logs:
job_ids += get_job_ids(os.path.join(dirpath_logs, filename))
# Modify jobs
for job_id in job_ids:
LOGGER.info("Sending cmd {} to job {}".format(cmd, job_id))
send_to_job(cmd, job_id)
if __name__ == "__main__":
description = (
"Send a command to all jobs logged in esub " "logfiles in a given directory"
)
parser = argparse.ArgumentParser(description=description, add_help=True)
parser.add_argument(
"--dirpath_logs",
type=str,
default="esub_logs",
help="Directory containing esub logs",
)
parser.add_argument(
"--cmd", type=str, required=True, help="Command to send to jobs"
)
parser.add_argument(
"--log_filter",
type=str,
help="String that must be contained in log filename "
"to receive cmd, default: all log files",
)
args = parser.parse_args()
main(args.dirpath_logs, args.cmd, log_filter=args.log_filter)