Pages

Thursday, July 17, 2008

Actions handler via filesystem monitoring

Avendo avuto la necessità di eseguire degli script bash che eseguono il riavvio di servers Weblogic senza avere a disposizione una shell da cui lanciarli abbiamo pensato le più disparate possibilità, ivi compreso smanettare tutto il giorno sulla console di Weblogic, progettare applicazioni standalone jmx, pagine jsp apposite.. oggi pomeriggio mi sono reso conto che in realtà tutto ciò che serve è un crontab funzionante.
Basta creare uno script shell lanciato ripetutamente da quel crontab (tipo ogni minuto) e che controlla l'esistenza di determinati files per lanciare azioni ad essi associate (e cancellare il file che ha scatenato l'azione).
Durante qualche ritaglio di tempo nelle pause ecco cos'è uscito fuori:
#!/bin/bash                  

#ACTIONSDIR="/tmp/actions"
ACTIONSDIR="/nodel/actions"
ACTIONSCRIPTSDIR="$ACTIONSDIR/scripts"
ACTIONS="restart-admin restart-batch crontab"

function doAction() {
action="$1"
actionfile="$ACTIONSDIR/$action"
actionscript="$ACTIONSCRIPTSDIR/${action}.sh"
if [ -r $actionfile.lock ]; then return; fi
echo "`date`: running action $action with script file $actionscript" > $actionfile.lock
echo "doing action $action (script file: $actionscript)"
chmod +x $actionscript
$actionscript $action $actionfile
rm $actionfile
rm $actionfile.lock
}

function createDir() {
dirToCreate=$1
if [ -d $dirToCreate ]; then
return
fi
mkdir -p $dirToCreate
}

createDir $ACTIONSDIR
createDir $ACTIONSCRIPTSDIR

for action in $ACTIONS; do
actionfile=$ACTIONSDIR/$action
if [ -r $actionfile ]; then
doAction $action &
fi
done



Un paio di commenti:
  • Per aggiungere/rimuovere azioni basta modificare la variabile ACTIONS e aggiungere gli script nella directory adeguata (specificata da ACTIONSCRIPTSDIR)
  • gli script vengono lanciati in maniera asincrona dal loop principale, ma in maniera sincrona nel doAction, in modo tale da cancellare il file di lancio solo dopo il termine dello script. Un file di lock impedisce di rilanciare l'azione se è ancora in esecuzione.
  • Il file di lancio viene passato come argomento (insieme al nome dell'azione) allo script. Questo permette di inserire un target come "crontab", che potrebbe essere usato per aggiornare il crontab appunto leggendo dal file di lancio il nuovo cron da installare.

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.