7 set 2010

Crontab condizionale

Ho la necessità di schedulare ad un orario prestabilito un job tramite crontab. All'ora prestabilita vorrei però che venga effettuato un controllo aggiuntivo, come l'esistenza di un file, l'attivazione di un servizio, o altro. Come posso fare?

Il job è inserito nella crontab in questo modo:

0 4 * * * sincronizza_dati.sh

il che indica che ogni mattina alle ore 4 verrà eseguito lo script sincronizza_dati.sh. Vorrei però eseguire questo script solamente se il servizio httpd è attivo.

Il mio script sincronizza_dati.sh potrebbe incominciare in questo modo:

#!/usr/bin/bash

if [ `service httpd status  | awk ' { print $3 } '` = "stopped" ]
then
  echo "Servizio disattivato! Usciamo!"
  exit
fi

echo "Servizio attivato! Procediamo con la sincronizzazione"

e spesso questa è la soluzione migliore (specie se la sincronia per andare a buon fine richiede per davvero che il servizio httpd sia attivo).
Ma se non è questo il caso allora meglio mettere la condizione nel crontab: in questo modo diventa anche più chiaro capire in quali condizioni lo script viene eseguito.

L'unico problema è trovare la sintassi giusta per farci stare tutto il comando su di una sola riga. Ad esempio si può scrivere il comando così:

0 4 * * * if [ `service httpd status  | awk ' { print $5 } '` = "running..." ]; then sincronizza_dati.sh; fi

Magari con l'aiuto di qualche script in perl si può avere una soluzione più pulita (non è bello avere una schifezza di awk sulla tabella crontab) ma... di quello ne parleremo nel prossimo disco!