You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

51 lines
1.6 KiB

#!/usr/bin/env python3
"""
Processes jobs queued by the miniq.py tool by searching the
queued jobs directory for job instances that still need processing.
"""
import os, json, pathlib
from settings import MINIQ_ROOT
# Sub-dir for queued jobs with params
QUEUED_JOBS = os.path.join(MINIQ_ROOT, 'queue')
# Sub-dir for job definition files
JOB_DEFS = os.path.join(MINIQ_ROOT, 'jobs')
# Guarantee that the sub-dirs all exist
pathlib.Path(QUEUED_JOBS).mkdir(parents=True, exist_ok=True)
pathlib.Path(JOB_DEFS).mkdir(parents=True, exist_ok=True)
def is_pending_job(file):
"""
Returns true if the given file name is a pending job.
"""
return os.path.isfile(os.path.join(QUEUED_JOBS, file)) and not file.startswith('processing')
# List of pending job file names
job_files = [f for f in os.listdir(QUEUED_JOBS) if is_pending_job(f)]
# Rename the pending job files with "processing." so they only get run once
for pending in job_files:
os.rename(os.path.join(QUEUED_JOBS, pending), os.path.join(QUEUED_JOBS, 'processing.' + pending))
job_files = ['processing.' + f for f in job_files]
for queued in job_files:
print('\nProcessing ' + queued + '...')
# Read the arguments and job name from the queue file JSON
with open(os.path.join(QUEUED_JOBS, queued)) as f:
data = json.load(f)
args = ['"' + str(arg) + '"' for arg in data['arguments']]
# Execute the job definition file with the given arguments
command = os.path.join(JOB_DEFS, data['job'] + '.job') + ' ' + ' '.join(args)
os.system(command)
# Remove the job queue file
os.remove(os.path.join(QUEUED_JOBS, queued))