#!/bin/bash# Este script permite lanzar trabajos de calculo en la cola de abaqus## Fede Diaz (nordri at gmail dot com)# Jul 30 2008# Leera la linea de comando y seleccionara los parametros
function parametro() {
echo $1| awk -F"="'{ print $1 " " $2 }'
}
# Escribira el script para lanzar el calculo y lo programara para# cuando el ultimo activo tenga que terminar.
function doCalcScript () {
BINDIR="/home/clabaqus/bin/abaqus";
echo -e "#!/bin/bash \n " \
"PATH=\"/usr/bin:/bin:/usr/local/bin\"\n" \
"cd $1 && abaqus input=$2 job=$3 cpus=$4">$BINDIR/S$3.sh;
chmod u+x $BINDIR/S$3.sh;
at $LASTJOBTIMEHUMAN-f $BINDIR/S$3.sh2>&1
}
# Escribira el script para terminar el calculo, antes verificara que no# este activo, si lo esta enviara la señal de terminate.
function doCalcKillScript () {
BINDIR="/home/clabaqus/bin/abaqus"PROC=$(pgrep Python.exe)
SEEKANDDESTROY="if [ $PROC ]; then cd $1 && abaqus terminate job=$2;fi \n";
SENDCALCREPORT="cd $1 && cat $2.log | email -s \"[ABAQUS] Resultado del calculo\" $3";
echo -e "#!/bin/bash \n " \
"PATH=\"/usr/bin:/bin:/usr/local/bin\"\n " \
"$SEEKANDDESTROY $SENDCALCREPORT">$BINDIR/K$2.sh;
chmod u+x $BINDIR/K$2.sh;
at $NEXTJOBTIMEDESTROY-f $BINDIR/K$2.sh2>&1
}
# Variables globales:# WD Directorio de trabajo donde se invoca al script# LASTJOBFILE Fichero donde apuntamos cuando estara libre la cola# EPOCHTIME La fecha epochWD=`pwd`LASTJOBFILE="/home/clabaqus/bin/var/lastjob"EPOCHTIME="1970-01-01"# echo -e "++++++ \033[40m\033[31mAVISO IMPORTANTE\033[0m ++++++"
echo "Programa para encolar problemas en ABAQUS"
echo ""
echo "Contacto: administrador_star.us.es"
echo "Version 0.4 Mayo 2009"
echo ""# Bucle para discriminar los parametros de la linea de comandofor param in"$@"do
miarray=(`parametro $param`)
if [ ${miarray[0]} =="input" ]; thenINPUT=${miarray[1]}
fi
if [ ${miarray[0]} =="job" ]; thenJOB=${miarray[1]}
fi
if [ ${miarray[0]} =="cpus" ]; thenCPUS=${miarray[1]}
fi
if [ ${miarray[0]} =="email" ]; thenEMAIL=${miarray[1]}
fi
if [ ${miarray[0]} =="time" ]; thenTIME=${miarray[1]}
fi
done
# Comprobamos que el trabajo tiene responsableif [ "x$EMAIL"=="x" ]; then
echo "No se permiten trabajos sin responsable. EL TRABAJO NO SE HA ENVIADO.";
exit 1;
fi
# Tomamos cuando estara libre la colaif [ -e $LASTJOBFILE ]; thenLASTJOBTIME=`cat $LASTJOBFILE`;
elseLASTJOBTIME=`date +%s`;
fi
# Calculamos la hora de ejecución# TIMEDESTROY Hora que se tiene que cortar el calculo# NEXTJOBTIMEDESTROY Hora que se tiene que cortar el calculo en HUMAN READABLE# TIMESEC La fecha de próxima ejecución en EPOCH# NEXTJOBTIME La fecha de próxima ejecución en HUMAN READABLETIMEDESTROY=`expr $LASTJOBTIME + $TIME \* 3600`|| exit 1NEXTJOBTIMEDESTROY=`date +'%H%M %b %d' -d "$EPOCHTIME $TIMEDESTROY sec utc" `;
TIMESEC=`expr $LASTJOBTIME + $TIME \* 3600 + 300`|| exit 1NEXTJOBTIME=`date +'%H%M %b %d' -d "$EPOCHTIME $TIMESEC sec utc" `;
# Programamos la ejecución del cálculoLASTJOBTIMEHUMAN=`date +'%H%M %b %d' -d "$EPOCHTIME $LASTJOBTIME sec utc" `;
doCalcScript $WD$INPUT$JOB$CPUS;
# Elaboramos la planificación de limpieza
doCalcKillScript $WD$JOB$EMAIL;
# Guardamos la hora de la proxima ejecucion
echo $TIMESEC>$LASTJOBFILE# elaboramos el correo electronicoNANOSECOND=`date +%N`TMPMAIL="/tmp/email$NANOSECOND"JOBNUMBER=`atq | sort | tail -n 1 | cut -f1,2 -d" "`TOTALJOBS=`atq | wc -l`
echo "Se ha enviado un nuevo trabajo a la cola">>$TMPMAIL
echo "">>$TMPMAIL
echo "Archivo de entrada : $INPUT">>$TMPMAIL
echo "Nombre del trabajo : $JOB">>$TMPMAIL
echo "Directorio de trabajo : $WD">>$TMPMAIL
echo "Numero de CPUS : $CPUS">>$TMPMAIL
echo "Numero de trabajo : $JOBNUMBER">>$TMPMAIL
echo "Numero total de trabajos : $TOTALJOBS">>$TMPMAIL
echo "Usuario responsable : $EMAIL">>$TMPMAIL
echo "Planificado para las : $LASTJOBTIMEHUMAN">>$TMPMAIL
cat $TMPMAIL| email -s "[ABAQUS-AT] Nuevo trabajo: $JOB"$EMAIL