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()
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)