Source code for esub.scripts.send_cmd
# Copyright (C) 2019 ETH Zurich,
# Institute for Particle Physics and Astrophysics
# Author: Joerg Herbel
import os
import shlex
import subprocess
import argparse
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)