1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/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