Two examples of submission scripts to PSI's T3 batch system. ===== Example 1 ===== #!/bin/bash ################################# # PSI Tier-3 example batch Job # ################################# ##### CONFIGURATION ############################################## # Output files to be copied back to the User Interface # (the file path must be given relative to the working directory) OUTFILES="myout.txt myerr.txt" # Output files to be copied to the SE # (as above the file path must be given relative to the working directory) SEOUTFILES="mybigfile" # # By default, the files will be copied to $USER_SRM_HOME/$username/$JOBDIR, # but here you can define the subdirectory under your SE storage path # to which files will be copied (uncomment line) #SEUSERSUBDIR="mytestsubdir/somedir" # # User's CMS hypernews name (needed for user's SE storage home path # USER_SRM_HOME below) HN_NAME=your-hn-name # set DBG=1 for additional debug output in the job report files # DBG=2 will also give detailed output on SRM operations DBG=0 #### The following configurations you should not need to change # The SE's user home area (SRMv2 URL) USER_SRM_HOME="srm://t3se01.psi.ch:8443/srm/managerv2?SFN=/pnfs/psi.ch/cms/trivcat/store/user/" # Top working directory on worker node's local disk. The batch # job working directory will be created below this TOPWORKDIR=/scratch/`whoami` # Basename of job sandbox (job workdir will be $TOPWORKDIR/$JOBDIR) JOBDIR=sgejob-$JOB_ID ################################################################## ############ BATCH QUEUE DIRECTIVES ############################## # Lines beginning with #$ are used to set options for the SGE # queueing system (same as specifying these options to the qsub # command # Job name (defines name seen in monitoring by qstat and the # job script's stderr/stdout names) #$ -N example_job ### Specify the queue on which to run #$ -q all.q # Change to the current working directory from which the job got # submitted (will also result in the job report stdout/stderr being # written to this directory) #$ -cwd # here you could change location of the job report stdout/stderr files # if you did not want them in the submission directory # #$ -o /shome/username/mydir/ # #$ -e /shome/username/mydir/ ################################################################## ##### MONITORING/DEBUG INFORMATION ############################### DATE_START=`date +%s` echo "Job started at " `date` cat <&2 exit 1 fi mkdir -p $WORKDIR if test ! -d "$WORKDIR"; then echo "ERROR: Failed to create workdir ($WORKDIR)! Aborting..." >&2 exit 1 fi cd $WORKDIR cat < myout.txt 2>myerr.txt lcg-ls -b -D srmv2 -l srm://t3se01.psi.ch:8443/srm/managerv2?SFN=/pnfs/psi.ch/cms/ >> myout.txt 2>>myerr.txt # create a dummy file for copying back to the SE dd if=/dev/urandom of=mybigfile count=100 &>/dev/null CMSSW_DIR=/shome/feichtinger/cmssw_test/CMSSW_2_1_6 CMSSW_CONFIG_FILE=$CMSSW_DIR/demoanalyzer-classic.cfg cd $CMSSW_DIR/src eval `scramv1 runtime -sh` if test $? -ne 0; then echo "ERROR: Failed to source scram environment" >&2 exit 1 fi cd $WORKDIR cmsRun $CMSSW_CONFIG_FILE maxEvents=$1 firstEvent=$2 inputFiles=$3 seed=$4> myout.txt 2>myerr.txt #### RETRIEVAL OF OUTPUT FILES AND CLEANING UP ############################ cd $WORKDIR if test 0"$DBG" -gt 0; then echo "########################################################" echo "############# Working directory contents ###############" echo "pwd: " `pwd` ls -Rl echo "########################################################" echo "YOUR OUTPUT WILL BE MOVED TO $RESULTDIR" echo "########################################################" fi if test x"$OUTFILES" != x; then mkdir -p $RESULTDIR if test ! -e "$RESULTDIR"; then echo "ERROR: Failed to create $RESULTDIR ...Aborting..." >&2 exit 1 fi for n in $OUTFILES; do if test ! -e $WORKDIR/$n; then echo "WARNING: Cannot find output file $WORKDIR/$n. Ignoring it" >&2 else cp -a $WORKDIR/$n $RESULTDIR/$n if test $? -ne 0; then echo "ERROR: Failed to copy $WORKDIR/$n to $RESULTDIR/$n" >&2 fi fi done fi if test x"$SEOUTFILES" != x; then if test 0"$DBG" -ge 2; then srmdebug="-v" fi for n in $SEOUTFILES; do if test ! -e $WORKDIR/$n; then echo "WARNING: Cannot find output file $WORKDIR/$n. Ignoring it" >&2 else lcg-cp $srmdebug -b -D srmv2 file:$WORKDIR/$n $SERESULTDIR/$n if test $? -ne 0; then echo "ERROR: Failed to copy $WORKDIR/$n to $SERESULTDIR/$n" >&2 fi fi done fi echo "Cleaning up $WORKDIR" rm -rf $WORKDIR ########################################################################### DATE_END=`date +%s` RUNTIME=$((DATE_END-DATE_START)) echo "################################################################" echo "Job finished at " `date` echo "Wallclock running time: $RUNTIME s" exit 0 ===== Example 2 ===== Trimmed version. #! /bin/bash # https://wiki.chipp.ch/twiki/bin/view/CmsTier3/HowToSubmitJobs # run with qsub -q all.q submitAnalysis.sh printf "###################################################\n" printf "## Run Analysis with input %-20s##\n" $1 printf "###################################################\n" DBG=2 # debugging level INPUT=$1; JOBLOGFILES="myout.txt myerr.txt" OUTFILES="*.png" TOPWORKDIR=/scratch/`whoami` JOBDIR="analysis/$1" BASEDIR="/shome/myusername/CMSSW_5_3_24/src/myAnalysisFolder" CMSSW_DIR="/shome/myusername/CMSSW_5_3_24" WORKDIR=$TOPWORKDIR/$JOBDIR OUTDIR=$BASEDIR/$JOBDIR # for output files RESULTDIR=$BASEDIR/$JOBDIR # for log files # to save large output files on storage element SEUSERSUBDIR="analysis/$1" SEOUTFILES="*.root" USER_SE_HOME="root://t3dcachedb.psi.ch:1094/pnfs/psi.ch/cms/trivcat/store/user/$USER" SERESULTDIR=$USER_SE_HOME/$SEUSERSUBDIR ##### MONITORING/DEBUG INFORMATION ######################################## # write job report (stdout of this script) mkdir -p /shome/myusername/CMSSW_5_3_24/src/myAnalysisFolder/analysis #$ -o /shome/myusername/CMSSW_5_3_24/src/myAnalysisFolder/analysis #$ -e /shome/myusername/CMSSW_5_3_24/src/myAnalysisFolder/analysis DATE_START=`date +%s` echo "Job started at " `date` cat <&2 exit 1 fi cd $WORKDIR cat <> myerr.txt cd $CMSSW_DIR/src eval `scramv1 runtime -sh` >> myout.txt 2>> myerr.txt if test $? -ne 0; then echo "ERROR: Failed to source scram environment" >&2 exit 1 fi cd $WORKDIR echo "python $BASEDIR/myAnalysis.py $INPUT >> myout.txt 2>> myerr.txt" python $BASEDIR/myAnalysis.py $INPUT >> myout.txt 2>> myerr.txt ls >> myout.txt 2>> myerr.txt ##### RETRIEVAL OF OUTPUT FILES AND CLEANING UP ########################### cd $WORKDIR if test 0"$DBG" -gt 0; then echo " " echo "###########################################################" echo "## MY OUTPUT WILL BE MOVED TO \$RESULTDIR and \$OUTDIR ##" echo "###########################################################" echo " \$RESULTDIR=$RESULTDIR" echo " \$OUTDIR=$OUTDIR" echo "pwd: " `pwd` ls -Rl fi # copy log files to $RESULTDIR if test x"$JOBLOGFILES" != x; then mkdir -p $RESULTDIR if test ! -e "$RESULTDIR"; then echo "ERROR: Failed to create $RESULTDIR ...Aborting..." >&2 fi for n in $JOBLOGFILES; do if test ! -e $WORKDIR/$n; then echo "WARNING: Cannot find output file $WORKDIR/$n. Ignoring it" >&2 else echo ">>> copying $n from $WORKDIR to $RESULTDIR" cp -a $WORKDIR/$n $RESULTDIR/$n if test $? -ne 0; then echo "ERROR: Failed to copy $WORKDIR/$n to $RESULTDIR/$n" >&2 fi fi done fi # copy output files to $OUTDIR if test x"$OUTFILES" != x; then mkdir -p $OUTDIR if test ! -e "$OUTDIR"; then echo "ERROR: Failed to create $OUTDIR ...Aborting..." >&2 fi for n in $OUTFILES; do if test ! -e $WORKDIR/$n; then echo "WARNING: Cannot find output file $WORKDIR/$n. Ignoring it" >&2 else echo ">>> copying $n from $WORKDIR to $OUTDIR" cp -a $WORKDIR/$n $OUTDIR/$n if test $? -ne 0; then echo "ERROR: Failed to copy $WORKDIR/$n to $OUTDIR/$n" >&2 fi fi done fi # copy large files to $SERESULTDIR if test x"$SEOUTFILES" != x; then if test ! -e "$SERESULTDIR"; then echo "ERROR: Failed to create $SERESULTDIR ...Aborting..." >&2 fi if test 0"$DBG" -ge 2; then srmdebug="-v" fi for n in $SEOUTFILES; do if test ! -e $WORKDIR/$n; then echo "WARNING: Cannot find output file $WORKDIR/$n. Ignoring it" >&2 else echo "xrdcp -f $WORKDIR/$n $SERESULTDIR/$n" >&2 xrdcp $srmdebug -d $DBG -f $WORKDIR/$n $SERESULTDIR/$n if test $? -ne 0; then echo "ERROR: Failed to copy $WORKDIR/$n to $SERESULTDIR/$n" >&2 fi fi done fi # cleaning working directory echo ">>> Cleaning up $WORKDIR" rm -rf $WORKDIR ########################################################################### DATE_END=`date +%s` RUNTIME=$((DATE_END-DATE_START)) echo " " echo "#####################################################" echo " Job finished at " `date` echo " Wallclock running time: $(( $RUNTIME / 3600 )):$(( $RUNTIME % 3600 /60 )):$(( $RUNTIME % 60 )) " echo "#####################################################" echo " " exit 0