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