job.py revision 1816
11376Sbinkertn@umich.edu#!/usr/bin/env python
21376Sbinkertn@umich.edu# Copyright (c) 2005 The Regents of The University of Michigan
31376Sbinkertn@umich.edu# All rights reserved.
41376Sbinkertn@umich.edu#
51376Sbinkertn@umich.edu# Redistribution and use in source and binary forms, with or without
61376Sbinkertn@umich.edu# modification, are permitted provided that the following conditions are
71376Sbinkertn@umich.edu# met: redistributions of source code must retain the above copyright
81376Sbinkertn@umich.edu# notice, this list of conditions and the following disclaimer;
91376Sbinkertn@umich.edu# redistributions in binary form must reproduce the above copyright
101376Sbinkertn@umich.edu# notice, this list of conditions and the following disclaimer in the
111376Sbinkertn@umich.edu# documentation and/or other materials provided with the distribution;
121376Sbinkertn@umich.edu# neither the name of the copyright holders nor the names of its
131376Sbinkertn@umich.edu# contributors may be used to endorse or promote products derived from
141376Sbinkertn@umich.edu# this software without specific prior written permission.
151376Sbinkertn@umich.edu#
161376Sbinkertn@umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
171376Sbinkertn@umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
181376Sbinkertn@umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
191376Sbinkertn@umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
201376Sbinkertn@umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
211376Sbinkertn@umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
221376Sbinkertn@umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
231376Sbinkertn@umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
241376Sbinkertn@umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
251376Sbinkertn@umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
261376Sbinkertn@umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
271376Sbinkertn@umich.edu#
281376Sbinkertn@umich.edu# Authors: Nathan Binkert
291376Sbinkertn@umich.edu#          Steve Reinhardt
301376Sbinkertn@umich.edu#          Ali Saidi
311376Sbinkertn@umich.edu
321376Sbinkertn@umich.eduimport os, os.path, shutil, signal, socket, sys, time
331376Sbinkertn@umich.edufrom os import environ as env
341376Sbinkertn@umich.edufrom os.path import join as joinpath, expanduser
351376Sbinkertn@umich.edu
361376Sbinkertn@umich.educlass rsync:
371376Sbinkertn@umich.edu    def __init__(self):
381376Sbinkertn@umich.edu        self.sudo = False
391376Sbinkertn@umich.edu        self.rsync = 'rsync'
401376Sbinkertn@umich.edu        self.compress = False
411376Sbinkertn@umich.edu        self.archive = True
421376Sbinkertn@umich.edu        self.delete = False
431376Sbinkertn@umich.edu        self.options = ''
441376Sbinkertn@umich.edu
451376Sbinkertn@umich.edu    def do(self, src, dst):
461376Sbinkertn@umich.edu        args = []
471376Sbinkertn@umich.edu        if self.sudo:
481376Sbinkertn@umich.edu            args.append('sudo')
491376Sbinkertn@umich.edu
501376Sbinkertn@umich.edu        args.append(self.rsync)
511376Sbinkertn@umich.edu        if (self.archive):
521376Sbinkertn@umich.edu            args.append('-a')
531376Sbinkertn@umich.edu        if (self.compress):
541376Sbinkertn@umich.edu            args.append('-z')
551376Sbinkertn@umich.edu        if (self.delete):
561376Sbinkertn@umich.edu            args.append('--delete')
571376Sbinkertn@umich.edu        if len(self.options):
581376Sbinkertn@umich.edu            args.append(self.options)
591376Sbinkertn@umich.edu        args.append(src)
601376Sbinkertn@umich.edu        args.append(dst)
611376Sbinkertn@umich.edu
621376Sbinkertn@umich.edu        return os.spawnvp(os.P_WAIT, args[0], args)
631376Sbinkertn@umich.edu
641376Sbinkertn@umich.edudef cleandir(dir):
651376Sbinkertn@umich.edu    for root, dirs, files in os.walk(dir, False):
661376Sbinkertn@umich.edu        for name in files:
671376Sbinkertn@umich.edu            os.remove(joinpath(root, name))
681376Sbinkertn@umich.edu        for name in dirs:
691376Sbinkertn@umich.edu            os.rmdir(joinpath(root, name))
701376Sbinkertn@umich.edu
711376Sbinkertn@umich.edudef date():
721376Sbinkertn@umich.edu    return time.strftime('%a %b %e %H:%M:%S %Z %Y', time.localtime())
731376Sbinkertn@umich.edu
741376Sbinkertn@umich.edudef remfile(file):
751376Sbinkertn@umich.edu    if os.path.isfile(file):
761376Sbinkertn@umich.edu        os.unlink(file)
771376Sbinkertn@umich.edu
781376Sbinkertn@umich.edudef readval(filename):
791376Sbinkertn@umich.edu    file = open(filename, 'r')
801376Sbinkertn@umich.edu    value = file.readline().strip()
811376Sbinkertn@umich.edu    file.close()
821376Sbinkertn@umich.edu    return value
831376Sbinkertn@umich.edu
841376Sbinkertn@umich.eduif __name__ == '__main__':
851376Sbinkertn@umich.edu    rootdir = env.setdefault('ROOTDIR', os.getcwd())
861816Sbinkertn@umich.edu    pbs_jobid = env['PBS_JOBID']
871816Sbinkertn@umich.edu    pbs_jobname = env['PBS_JOBNAME']
881376Sbinkertn@umich.edu    basedir = joinpath(rootdir, 'Base')
891816Sbinkertn@umich.edu    jobname = env.setdefault('JOBNAME', pbs_jobname)
901816Sbinkertn@umich.edu    jobfile = env.setdefault('JOBFILE', joinpath(basedir, 'test.py'))
911816Sbinkertn@umich.edu    outdir = env.setdefault('OUTPUT_DIR', joinpath(rootdir, jobname))
921816Sbinkertn@umich.edu    env['POOLJOB'] = 'True'
931376Sbinkertn@umich.edu
941816Sbinkertn@umich.edu    if os.path.isdir("/work"):
951816Sbinkertn@umich.edu        workbase = "/work"
961816Sbinkertn@umich.edu    else:
971816Sbinkertn@umich.edu        workbase = "/tmp/"
981816Sbinkertn@umich.edu
991816Sbinkertn@umich.edu    workdir = joinpath(workbase, '%s.%s' % (env['USER'], pbs_jobid))
1001376Sbinkertn@umich.edu
1011376Sbinkertn@umich.edu    def echofile(filename, string):
1021376Sbinkertn@umich.edu        try:
1031816Sbinkertn@umich.edu            f = file(joinpath(outdir, filename), 'w')
1041376Sbinkertn@umich.edu            print >>f, string
1051376Sbinkertn@umich.edu            f.flush()
1061376Sbinkertn@umich.edu            f.close()
1071376Sbinkertn@umich.edu        except IOError,e:
1081376Sbinkertn@umich.edu            sys.exit(e)
1091376Sbinkertn@umich.edu
1101376Sbinkertn@umich.edu    os.umask(0022)
1111376Sbinkertn@umich.edu
1121376Sbinkertn@umich.edu    echofile('.start', date())
1131816Sbinkertn@umich.edu    echofile('.pbs_jobid', pbs_jobid)
1141816Sbinkertn@umich.edu    echofile('.pbs_jobname', pbs_jobid)
1151376Sbinkertn@umich.edu    echofile('.host', socket.gethostname())
1161376Sbinkertn@umich.edu
1171376Sbinkertn@umich.edu    if os.path.isdir(workdir):
1181376Sbinkertn@umich.edu        cleandir(workdir)
1191376Sbinkertn@umich.edu    else:
1201376Sbinkertn@umich.edu        os.mkdir(workdir)
1211376Sbinkertn@umich.edu
1221376Sbinkertn@umich.edu    if os.path.isdir('/z/dist'):
1231376Sbinkertn@umich.edu        sync = rsync()
1241376Sbinkertn@umich.edu        sync.delete = True
1251376Sbinkertn@umich.edu        sync.sudo = True
1261376Sbinkertn@umich.edu        sync.do('poolfs::dist/m5/', '/z/dist/m5/')
1271376Sbinkertn@umich.edu
1281376Sbinkertn@umich.edu    try:
1291376Sbinkertn@umich.edu        os.chdir(workdir)
1301376Sbinkertn@umich.edu    except OSError,e:
1311376Sbinkertn@umich.edu        sys.exit(e)
1321376Sbinkertn@umich.edu
1331816Sbinkertn@umich.edu    os.symlink(joinpath(outdir, 'output'), 'status.out')
1341376Sbinkertn@umich.edu
1351712Sstever@eecs.umich.edu    args = [ joinpath(basedir, 'm5'), joinpath(basedir, 'run.py') ]
1361376Sbinkertn@umich.edu    if not len(args):
1371376Sbinkertn@umich.edu        sys.exit("no arguments")
1381376Sbinkertn@umich.edu
1391376Sbinkertn@umich.edu    print 'starting job... %s' % date()
1401376Sbinkertn@umich.edu    print ' '.join(args)
1411376Sbinkertn@umich.edu    print
1421376Sbinkertn@umich.edu    sys.stdout.flush()
1431376Sbinkertn@umich.edu
1441376Sbinkertn@umich.edu    childpid = os.fork()
1451376Sbinkertn@umich.edu    if not childpid:
1461376Sbinkertn@umich.edu        # Execute command
1471376Sbinkertn@umich.edu        sys.stdin.close()
1481816Sbinkertn@umich.edu        fd = os.open(joinpath(outdir, "output"),
1491376Sbinkertn@umich.edu                     os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
1501376Sbinkertn@umich.edu        os.dup2(fd, sys.stdout.fileno())
1511376Sbinkertn@umich.edu        os.dup2(fd, sys.stderr.fileno())
1521376Sbinkertn@umich.edu        os.execvp(args[0], args)
1531376Sbinkertn@umich.edu
1541376Sbinkertn@umich.edu    def handler(signum, frame):
1551376Sbinkertn@umich.edu        if childpid != 0:
1561376Sbinkertn@umich.edu            os.kill(childpid, signum)
1571376Sbinkertn@umich.edu
1581376Sbinkertn@umich.edu    signal.signal(signal.SIGHUP, handler)
1591376Sbinkertn@umich.edu    signal.signal(signal.SIGINT, handler)
1601376Sbinkertn@umich.edu    signal.signal(signal.SIGQUIT, handler)
1611376Sbinkertn@umich.edu    signal.signal(signal.SIGTERM, handler)
1621376Sbinkertn@umich.edu    signal.signal(signal.SIGSTOP, handler)
1631376Sbinkertn@umich.edu    signal.signal(signal.SIGCONT, handler)
1641376Sbinkertn@umich.edu    signal.signal(signal.SIGUSR1, handler)
1651376Sbinkertn@umich.edu    signal.signal(signal.SIGUSR2, handler)
1661376Sbinkertn@umich.edu
1671376Sbinkertn@umich.edu    done = 0
1681376Sbinkertn@umich.edu    while not done:
1691376Sbinkertn@umich.edu        try:
1701376Sbinkertn@umich.edu            thepid,ec = os.waitpid(childpid, 0)
1711376Sbinkertn@umich.edu            if ec:
1721376Sbinkertn@umich.edu                print 'Exit code ', ec
1731376Sbinkertn@umich.edu                echofile('.failure', date())
1741376Sbinkertn@umich.edu            else:
1751376Sbinkertn@umich.edu                echofile('.success', date())
1761376Sbinkertn@umich.edu            done = 1
1771376Sbinkertn@umich.edu        except OSError:
1781376Sbinkertn@umich.edu            pass
1791376Sbinkertn@umich.edu
1801376Sbinkertn@umich.edu    print '\njob complete... %s' % date()
1811376Sbinkertn@umich.edu    echofile('.stop', date())
182