2012-09-08 23 views
6

A continuación se muestra mi script que estoy ejecutando en el bash. Y funciona bien¿Cómo se maneja el error/excepción en el script de shell?

fileexist=0 
for i in $(ls /data/read-only/clv/daily/Finished-HADOOP_EXPORT_&processDate#.done); do 
    mv /data/read-only/clv/daily/Finished-HADOOP_EXPORT_&processDate#.done /data/read-only/clv/daily/archieve-wip/ 
    fileexist=1 
done 

Planteamiento del problema: -

En mi script de shell encima de la cual se tiene que ejecutar diariamente utilizando cron job, no tengo ninguna error/exception handling mechanism. Supongamos que si algo sale mal, entonces no sé qué ha pasado.

Como después de que se ejecuta la secuencia de comandos anterior, hay some other scripts that will be dependent on the data provided by above script, por lo que siempre recibo quejas de las otras personas que dependen de los datos de mi script que algo malo sucedió.

¿Hay alguna manera de que pueda get notified if anything wrong has happened en mi script? Supongamos que si el cluster is having some maintenance y en ese momento estoy ejecutando mi script, definitivamente estará fallando, así que me pueden notificar si mis scripts anteriores fallaron, para estar seguro de que algo malo sucedió.

Espero que mi pregunta sea lo suficientemente clara.

Cualquier pensamiento será apreciado.

+0

@Levon, Listo. ¿Ahora es mejor? – ferhan

+0

Sí, creo que esto se ve mucho mejor y más legible, no intimidará a los posibles ayudantes lejos :) – Levon

+0

Sí. Gracias por el consejo. Me aseguraré de que la próxima vez sea seguro. :) – ferhan

Respuesta

11

puede comprobar si el estado de salida de cada comando, como freetx respondió, pero esto es comprobación manual de errores en lugar de manejo de excepciones. La forma estándar de obtener el equivalente del manejo de excepciones en sh es iniciar el script con set -e. Eso le indica al sh que salga con un estado distinto de cero tan pronto como un comando ejecutado falla (es decir, sale con un estado de salida distinto de cero).

Si se pretende que algún comando de dicho script (posiblemente) falle, puede usar el constructo COMMAND || true, que forzará un estado de salida cero para esa expresión.Por ejemplo:

#!/bin/sh 

# if any of the following fails, the script fails 
set -e 
mkdir -p destdir/1/2 
mv foo destdir/1/2 
touch /done || true # allowed to fail 

otra manera de asegurarse de que se le notifique cuando las cosas van mal en un script invocado por cron es adherirse a la convención de Unix printing nothing unless an error ocurred. Las ejecuciones correctas pasarán sin previo aviso, y las ejecuciones fallidas harán que el cron daemon le notifique el error por correo electrónico. Tenga en cuenta que la entrega de correo local debe estar correctamente configurada en su sistema para que esto funcione.

5

Es costumbre que cada utilidad de línea de comandos de unix regrese 0 al éxito y que no sea cero cuando falla. Por lo tanto, puede usar el $? patrón para mostrar el último valor de retorno y manejar las cosas en consecuencia.

Por ejemplo:

> ls 
> file1 file2 
> echo $? 
> 0 
> ls file.no.exist 
> echo $? 
> 1 

Por lo tanto, puede utilizar esta detección de errores como rudimentaria para ver si algo va mal. Por lo que la aproximación normal sería

some_command 
if [ $? -gt 0 ] 
then 
handle_error here 
fi 
+4

En realidad, la forma idiomática de escribir es 'si! some_command; entonces ... Mucha gente no parece darse cuenta de que el único propósito de "si" es ejecutar un comando y examinar su código de salida para determinar si tiene éxito o falla. – tripleee

0

bien si otras secuencias de comandos están en la misma máquina, entonces usted podría hacer un pgrep en otros guiones para este script si se descubre que dormir un rato y probar otros scripts después de volver a comprobar proceso es ido.

Si la escritura es en otra máquina o incluso local, el otro método es producir un archivo temporal en la máquina remota accesible a través de un navegador http ejecución que otros scripts pueden comprobar el estado es decir, correr o completa

Usted también podría ya sea envoltura guión alrededor de otro que se ve por estos errores y mensajes de correo electrónico que si lo encuentra, si no envía el resultado como por normal que alguna vez

go=0; 
function check_running() { 

     running=`pgrep -f your_script.sh|wc -l ` 
    if [ $running -gt 1 ]; then 
     echo "already running $0 -- instances found $running "; 
     go=1; 
} 

check_running; 
if [ $go -ge 1 ];then 
     execute your other script 
else 
    sleep 120; 
    check_running; 
fi 
Cuestiones relacionadas