Start, Stop, Restart

ok, in attesa di argomenti più impegnativi, iniziamo con un post piuttosto semplice ma decisamente utile: gli script di startup degli applicativi.

Quante volte avrete lanciato e rilanciato il vostro jetty/tomcat/jboss per testare e ri-testare il vostro applicativo, ma, una volta giunti sulla macchina di testing/integrazione/preproduzione/produzione, le cose non sono più cosi semplici: l’applicativo deve essere lanciato e restare up&running in modo che gli altri sviluppatori possano accedere e verificare le loro modifiche, i QA testare le funzionalità e i commerciali fare delle splendide demo per affascinare i clienti.

Ma prima di far ripartire l’ambiente avete verificato che l’istanza precedente fosse correttamente stoppata? Vi siete ricordati di patchare quella particolare libreria terze parti prima di far ripartire il tutto? E se l’ultima volta l’ambiente è partito coi privilegi di amministratore? forse è per questo che i log sono pieni di “permission denied” e l’ambiente non parte…
OK, tutto a posto, ora funziona. Quanto tempo avete perso? per quante macchine dovete ripetere il tutto ?

Scherzi a parte creare un buono script di startup per il vostro ambiente può essere un task tutt’altro che banale, e se volete essere davvero pignoli vi accorgerete che potreste perderci delle ore. Ma state sicuri che sarà tutto tempo che recuperere ogni volte che schiaccerete un semplice tasto e il vostro applicativo partirà sgommando senza il minimo problema.

Iniziamo riordinano le idee, cosa vogliamo che faccia il nostro magico script?

  1. Ci permetta di far partire il nostro applicativo (fin qui…), ma anche di stopparlo nel modo corretto, di fornirci informazioni sul suo stato, riavviarlo o killarlo brutalmente qualora non fosse fuori controllo.
    Se proprio volete strafare anche una bella opzione di avvio in modalità debug per gli sviluppatori più esigenti non fa male..
  2. Ci permetta di far girare l’applicativo SENZA privilegi amministrativi (non è mai una buona pratica avere un applicativo che gira come root, e di solito ce ne si pente sempre troppo tardi) e che utilizzi sempre lo stesso utente indipendentemente da chi lo avvii.
  3. Ci permetta di installare l’applicativo come servizio, in modo che in caso di reboot della macchina venga correttamente spento e riparta appena la macchina è nuovamente up and running.
  4. Si renda conto da solo se un’altra istanza dello stesso applicativo è già attiva, e in tal caso ci avvisi, evitando istanze sovrapposte.
  5. Ci permetta, in modo modulare, di eseguire comandi aggiuntivi prima dello start, dopo lo stop e ad ogni restart.

Pochi punti, ma già la faccenda si fa decisamente più complicata, non trovate?

Qui di seguito trovate un estratto di uno script che permette di fare tutto questo con un tomcat, in ambiente linux, il tutto si può estendere in maniera piuttosto semplice (se controllate il codice lo stesso comando da lanciare è parametrizzato) per altri application server o normali applicazioni.

#!/bin/bash
#
# tomcat7 This shell script takes care of starting and stopping Tomcat
# Description: This shell script takes care of starting and stopping Tomcat
# chkconfig: – 80 20
#
## Source function library.
#. /etc/rc.d/init.d/functions
TOMCAT_NAME=AppName
TOMCAT_HOME=${application.path.base}/$TOMCAT_NAME/tomcat
RUNAS_USER=${runas.user}
RUN_USER=$(whoami)

export EXTRA_STOP_COMMAND=”${application.extra.stop.command}”
export EXTRA_START_COMMAND=”${application.extra.start.command}”
export EXTRA_RESTART_COMMAND=”${application.extra.restart.command}”

SHUTDOWN_WAIT=20
RUN=”$TOMCAT_HOME/bin/startup.sh”

tomcat_pid() {
echo `ps aux | grep org.apache.catalina.startup.Bootstrap| grep $TOMCAT_HOME | grep -v grep | awk ‘{ print $2 }’`
}

start() {

cd $TOMCAT_HOME/bin
mkdir -p $TOMCAT_HOME/logs

pid=$(tomcat_pid)
if [ -n “$pid” ]
then
echo “Tomcat ($TOMCAT_NAME) is already running (pid: $pid)”
else
# Start tomcat
echo “Starting tomcat ($TOMCAT_NAME)”
if [ “$RUN_USER” == “$RUNAS_USER” ]
then
echo “Running with current user”
if [ “$EXTRA_START_COMMAND” != “” ]; then
echo “Running EXTRA_START_COMMAND”
“$EXTRA_START_COMMAND”
fi
$RUN

else
echo “Running with sudo”
if [ “$EXTRA_START_COMMAND” != “” ]; then
echo “Running EXTRA_START_COMMAND”
sudo -u $RUNAS_USER sh “$EXTRA_START_COMMAND”
fi
sudo -u $RUNAS_USER sh $RUN
fi
fi

return 0
}

stop() {
pid=$(tomcat_pid)
if [ -n “$pid” ]
then
echo “Stoping Tomcat ($TOMCAT_NAME)”
if [ “$RUN_USER” == “$RUNAS_USER” ]
then
$TOMCAT_HOME/bin/shutdown.sh
else
sudo -u $RUNAS_USER sh $TOMCAT_HOME/bin/shutdown.sh
fi

let kwait=$SHUTDOWN_WAIT
count=0;
until [ `ps -p $pid | grep -c $pid` = ‘0’ ] || [ $count -gt $kwait ]
do
echo -n -e “\nwaiting for processes to exit”;
sleep 1
let count=$count+1;
done

if [ $count -gt $kwait ]; then
echo -n -e “\nkilling processes which didn’t stop after $SHUTDOWN_WAIT seconds”
kill -9 $pid
fi
else
echo “Tomcat ($TOMCAT_NAME) is not running”
fi
if [ “$RUN_USER” == “$RUNAS_USER” ]
then
if [ “$EXTRA_STOP_COMMAND” != “” ]; then
echo “Running EXTRA_STOP_COMMAND”
“$EXTRA_STOP_COMMAND”
fi
else
if [ “$EXTRA_STOP_COMMAND” != “” ]; then
echo “Running EXTRA_STOP_COMMAND”
sudo -u $RUNAS_USER sh “$EXTRA_STOP_COMMAND”
fi
fi
return 0
}

case $1 in
start)
start
;;
debug)
RUN=”$TOMCAT_HOME/bin/catalina.sh jpda start”
start
;;
stop)
stop
;;
restart)
stop
echo
echo “Sleeping 5s before starting again”
sleep 5
if [ “$RUN_USER” == “$RUNAS_USER” ]
then
if [ “$EXTRA_RESTART_COMMAND” != “” ]; then
echo “Running EXTRA_RESTART_COMMAND”
“$EXTRA_RESTART_COMMAND”
fi
else
if [ “$EXTRA_RESTART_COMMAND” != “” ]; then
echo “Running EXTRA_RESTART_COMMAND”
sudo -u $RUNAS_USER sh “$EXTRA_RESTART_COMMAND”
fi
fi
start
;;
status)
pid=$(tomcat_pid)
if [ -n “$pid” ]
then
echo “Tomcat ($TOMCAT_NAME) is running with pid: $pid”
else
echo “Tomcat ($TOMCAT_NAME) is not running”
fi
;;
*)
echo “Usage: $0 {start|debug|restart|stop|status}”
exit 1
esac
exit 0

con questo script potrete:

  • Installare l’applicativo come servizio linux, in modo che possa partire all’avvio della macchina senza bisogno di avviarlo manualmente.
  • Il servizio girerà in background, quindi la chiusura della console non comporterà lo stop del servizio stesso.
  • L’applicativo girerà con un utente da voi stabilito, e senza privilegi particolari. Qualora fosse un altro utente (o il sistema operativo stesso) a lanciare lo script, questo switcherà sull’utente predefinito tramite sudo
  • In caso di stop, lo script prima tenterà di utilizzare la procedura standard di tomcat per spegnere l’application server, in caso questa fallisse , procederà ad effettuare un kill del processo, infine se dopo 20 secondi il processo fosse ancora attivo, porrà fine alle sue sofferenze con un bel kill -9
  • Il PID del processo è visualizzabile tramite il comando status, il processo viene ricercato nella tabella dei processi in base alla classe lanciata dall’applicativo e dal path di startup , in modo da essere sicuri di poter gestire anche istanze multiple dello stesso programma.
  • Lo stesso processo viene controllato in fase di start per verificare se istanze dello stesso applicativo sono già attive ed evitare esecuzioni sovrapposte.
  • Per ogni fase di start, stop e restart, è possibile definire dei comandi/script esterni da lanciare prima dello start, dopo lo stop o nel mezzo di un restart, in modo da poter gestire automaticamente attività “complementari” all’avvio dell’applicativo.
Annunci

Un pensiero su “Start, Stop, Restart

  1. Pingback: Selenium Grid – installazione | Around the Code

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...