Mercurial > treepkg
view bin/jobdaemon.py @ 481:9c7e1d957d6b
sawmill: Not all displayed times are in UTC so the
general 'Z's at all times/dates are removed. Now
it is only mentioned that the times in the main
table are in UTC. To reduce the optical noise
this is done by simple comments in the date rows.
author | Sascha Teichmann <teichmann@intevation.de> |
---|---|
date | Sat, 18 Sep 2010 07:50:53 +0000 |
parents | c1d5a6cb5cb0 |
children |
line wrap: on
line source
#!/usr/bin/env python import os.path import sys import shlex import traceback import time from optparse import OptionParser CONFIG_FILE = os.environ.get("JOBDAEMON_CFG", "jobdaemon.cfg") SLEEP = int(os.environ.get("JOBDAEMON_SLEEP", "60")) def fork(job): pid = os.fork() if pid: return pid os.execv(job[0], job) return -1 # never reached class Jobs(object): def __init__(self, filename): self.load_config(filename) def load_config(self, filename): print >> sys.stderr, "loading config file '%s'" % filename plan, jobs = [], [] f = open(filename, "r") try: while True: line = f.readline() if not line: break line = line.strip() if not line or line.startswith("#"): continue if line.startswith("BLOCKER:"): line = line[len("BLOCKER:"):].strip() plan.append((jobs, line)) jobs = [] continue jobs.append(shlex.split(line)) finally: f.close() if jobs: plan.append((jobs, None)) self.plan = plan def run_jobs(self, jobs): pids = [] for job in jobs: try: pids.append(fork(job)) except: traceback.print_exc() for pid in pids: try: os.waitpid(pid, 0) except: traceback.print_exc() def run(self): for jobs, blocker in self.plan: self.run_jobs(jobs) if blocker: try: os.system(blocker) except: traceback.print_exc() def main(): global config_changed parser = OptionParser() parser.add_option( "-c", "--config", dest="config", help="load configuration from file", metavar="FILE", default=CONFIG_FILE) parser.add_option( "-s", "--sleep", dest="sleep_time", help="sleep time between runs", type="int", metavar="TIME", default=SLEEP) (options, _) = parser.parse_args() if not os.path.isfile(options.config): print >> sys.stderr, "config file '%s' does not exists." sys.exit(1) modtime = os.stat(options.config).st_mtime jobs = Jobs(options.config) while True: if os.path.isfile(options.config): nmodtime = os.stat(options.config).st_mtime if nmodtime > modtime: modtime = nmodtime jobs = Jobs(options.config) jobs.run() time.sleep(options.sleep_time) if __name__ == '__main__': main()