Report abuse

#!/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.sh 2>&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.sh 2>&1
}

# Variables globales:
# WD Directorio de trabajo donde se invoca al script
# LASTJOBFILE Fichero donde apuntamos cuando estara libre la cola
# EPOCHTIME La fecha epoch
WD=`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 comando
for param in "$@"
do
 miarray=(`parametro $param`)

 if [ ${miarray[0]} == "input" ]; then
   INPUT=${miarray[1]}
 fi

 if [ ${miarray[0]} == "job" ]; then
   JOB=${miarray[1]}
 fi

 if [ ${miarray[0]} == "cpus" ]; then
   CPUS=${miarray[1]}
 fi

 if [ ${miarray[0]} == "email" ]; then
   EMAIL=${miarray[1]}
 fi

 if [ ${miarray[0]} == "time" ]; then
   TIME=${miarray[1]}
 fi
done

# Comprobamos que el trabajo tiene responsable
if [ "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 cola
if [ -e $LASTJOBFILE ]; then
 LASTJOBTIME=`cat $LASTJOBFILE`;
else
 LASTJOBTIME=`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 READABLE
TIMEDESTROY=`expr $LASTJOBTIME + $TIME \* 3600` || exit 1
NEXTJOBTIMEDESTROY=`date +'%H%M %b %d' -d "$EPOCHTIME $TIMEDESTROY sec utc" `;
TIMESEC=`expr $LASTJOBTIME + $TIME \* 3600 + 300` || exit 1
NEXTJOBTIME=`date +'%H%M %b %d' -d "$EPOCHTIME $TIMESEC sec utc" `;

# Programamos la ejecución del cálculo
LASTJOBTIMEHUMAN=`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 electronico
NANOSECOND=`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