#!/bin/bash # set -x # # Input: path to grami file (same as Globus). # This script creates a temporary job script and runs it. echo "----- starting submit_fork_job -----" 1>&2 joboption_lrms="fork" # ARC1 passes first the config file. if [ "$1" = "--config" ]; then shift; ARC_CONFIG=$1; shift; fi GRAMI_FILE=$1 # define paths and config parser basedir=`dirname $0` basedir=`cd $basedir > /dev/null && pwd` || exit $? . "${basedir}/lrms_common.sh" # include common submit functions . "${pkgdatadir}/submit_common.sh" || exit $? # run common init # * parse grami # * parse config # * load LRMS-specific env # * set common variables common_init # always local RUNTIME_NODE_SEES_FRONTEND=yes ############################################################## # Zero stage of runtime environments ############################################################## RTE_stage0 ############################################################## # create job script ############################################################## mktempscript chmod u+x ${LRMS_JOB_SCRIPT} ############################################################## # Start job script ############################################################## echo '#!/bin/sh' > $LRMS_JOB_SCRIPT echo "# Fork job script built by arex" >> $LRMS_JOB_SCRIPT echo "" >> $LRMS_JOB_SCRIPT ############################################################## # non-parallel jobs ############################################################## set_count ############################################################## # Execution times (obtained in seconds) ############################################################## if [ ! -z "$joboption_walltime" ] ; then if [ $joboption_walltime -lt 0 ] ; then echo 'WARNING: Less than 0 wall time requested: $joboption_walltime' 1>&2 joboption_walltime=0 echo 'WARNING: wall time set to 0' 1>&2 fi maxwalltime="$joboption_walltime" elif [ ! -z "$joboption_cputime" ] ; then if [ $joboption_cputime -lt 0 ] ; then echo 'WARNING: Less than 0 cpu time requested: $joboption_cputime' 1>&2 joboption_cputime=0 echo 'WARNING: cpu time set to 0' 1>&2 fi maxwalltime="$joboption_cputime" fi if [ ! -z "$maxwalltime" ] ; then echo "ulimit -t $maxwalltime" >> $LRMS_JOB_SCRIPT fi sourcewithargs_jobscript ############################################################## # Override umask ############################################################## echo "" >> $LRMS_JOB_SCRIPT echo "# Overide umask of execution node (sometime values are really strange)" >> $LRMS_JOB_SCRIPT echo "umask 077" >> $LRMS_JOB_SCRIPT ############################################################## # Init accounting ############################################################## accounting_init ############################################################## # Add environment variables ############################################################## add_user_env ############################################################## # Check for existance of executable, ############################################################## if [ -z "${joboption_arg_0}" ] ; then echo 'Executable is not specified' 1>&2 exit 1 fi setup_runtime_env ############################################################## # Add std... to job arguments ############################################################## include_std_streams ############################################################## # Move files to local working directory (job is done on node only) # RUNTIME_JOB_DIR -> RUNTIME_LOCAL_SCRATCH_DIR/job_id ############################################################## move_files_to_node echo "" >> $LRMS_JOB_SCRIPT echo "RESULT=0" >> $LRMS_JOB_SCRIPT echo "" >> $LRMS_JOB_SCRIPT echo "" >> $LRMS_JOB_SCRIPT echo "if [ \"\$RESULT\" = '0' ] ; then" >> $LRMS_JOB_SCRIPT ############################################################## # Runtime configuration ############################################################## RTE_stage1 echo "echo \"runtimeenvironments=\$runtimeenvironments\" >> \"\$RUNTIME_JOB_DIAG\"" >> $LRMS_JOB_SCRIPT ##################################################### # Accounting (WN OS Detection) ##################################################### detect_wn_systemsoftware ##################################################### # Go to working dir and start job ##################################################### # Set the nice value (20 to -20) based on priority (1 to 100) # Note negative values are normally only settable by superusers priority=$joboption_priority if [ ! -z $priority ]; then if [ `id -u` = '0' ]; then nicevalue=$[ 20 - ($priority * 2 / 5) ] else nicevalue=$[ 20 - ($priority / 5) ] fi joboption_args="nice -n $nicevalue $joboption_args" fi cd_and_run echo "fi" >> $LRMS_JOB_SCRIPT echo "" >> $LRMS_JOB_SCRIPT ############################################################## # Runtime (post)configuration at computing node ############################################################## RTE_stage2 ############################################################## # Move files back to session directory (job is done on node only) # RUNTIME_JOB_DIR -> RUNTIME_LOCAL_SCRATCH_DIR/job_id ############################################################## move_files_to_frontend ############################################################## # Finish accounting and exit job ############################################################## accounting_end ####################################### # watcher process ####################################### JOB_ID= cleanup() { [ -n "$JOB_ID" ] && kill -9 $JOB_ID 2>/dev/null # remove temp files rm -f "$LRMS_JOB_SCRIPT" "$LRMS_JOB_OUT" } watcher() { "$1" > "$2" 2>&1 & rc=$? JOB_ID=$! export JOB_ID trap cleanup 0 1 2 3 4 5 6 7 8 10 12 15 if [ $rc -ne 0 ]; then echo "FAIL" > "$3" exit 1 else echo "OK" > "$3" wait $JOB_ID fi } ####################################### # Submit the job ####################################### echo "job script ${LRMS_JOB_SCRIPT} built:" 1>&2 echo "-------------------------------------------------------------------" 1>&2 cat "$LRMS_JOB_SCRIPT" 1>&2 echo "-------------------------------------------------------------------" 1>&2 echo "" 1>&2 # simple queuing system: make hard reference to the queue cd "$joboption_directory" 1>&2 || { echo "Could not cd to $joboption_directory, aborting" && exit 1; } # Bash (but not dash) needs the parantheses, otherwise 'trap' has no effect! ( watcher "$LRMS_JOB_SCRIPT" "${joboption_directory}.comment" "$LRMS_JOB_ERR"; ) & job_id=$! result= while [ -z "$result" ]; do sleep 1 result=`cat $LRMS_JOB_ERR` done case "$result" in OK) echo "job submitted successfully!" 1>&2 echo "local job id: $job_id" 1>&2 echo "joboption_jobid=$job_id" >> $GRAMI_FILE rc=0 ;; *) echo "job *NOT* submitted successfully!" 1>&2 echo "" 1>&2 echo "Output is:" 1>&2 cat $LRMS_JOB_OUT 1>&2 rm -f $LRMS_JOB_SCRIPT $LRMS_JOB_OUT $LRMS_JOB_ERR rc=1 ;; esac rm "$LRMS_JOB_ERR" echo "----- exiting submit_fork_job -----" 1>&2 echo "" 1>&2 exit $rc