2010-05-11 13 views
5

Tengo un script de shell que transfiere un archivo build.xml a una máquina remota UNIX (devrsp02) y ejecuta la tarea ANT wldeploy en esa máquina (devrsp02). Ahora, esta tarea wldeploy toma alrededor de 15 minutos para completar y si bien esto está en funcionamiento, la última línea en la consola Unix es -¿Cómo hacer el procesamiento paralelo en el script Unix Shell?

"la tarea {} algunos dígitos inicializado".

Una vez que se completa esta tarea, obtenemos un mensaje de "tarea completada" y la siguiente tarea en el script se ejecuta solo después de eso.

Pero a veces, puede haber un problema con el dominio weblogic y la implementación puede estar fallando internamente, sin afectar el estado de la tarea wldeploy. La consola de Unix seguirá bloqueada en "tarea {algún dígito} inicializado". El error del despliegue será conseguir registra en un archivo llamado output.a

lo tanto, lo que quiero ahora es -

Iniciar un contador de tiempo antes de ejecutar wldeploy. Si el wldeploy tiene una duración de más de 15 minutos, el siguiente comando debe ejecutarse -

tail-f output.a ## sin terminar el wldeploy

o

salida de gato .a ## después de terminar el wldeploy con fuerza

Lo que hay que señalar aquí es - No puedo ejecutar la tarea wldeploy en segundo plano, como en En ese caso, el usuario no sabrá cuándo se completa la tarea, que es crucial para este script.

¿Podría sugerir algo para lograrlo?

Respuesta

3

crear este script (deploy.sh por ejemplo):

#!/bin/sh 
sleep 900 && pkill -n wldeploy && cat output.a & 
wldeploy 

Luego de la consola

chmod +x deploy.sh 

A continuación, ejecute

./deploy.sh 

Este script se iniciará un contador (15 minutos) que matará por la fuerza el proceso wldeploy si se está ejecutando, y si el p rocess se está ejecutando verá el contenido de output.a.

Si la secuencia de comandos ha terminado, pkill no devolverá verdadero y output.a no se mostrará.

Yo llamaría a esto monitoreo en lugar de "procesamiento en paralelo" :) tarea

+0

Sin embargo, tenga cuidado de no ejecutar más de una copia de deploy.sh a la vez. – pra

+0

Hola Andy. Este enfoque simplemente terminaría el despliegue de wl después de 900 segundos. Eso no es lo que quería. Gracias por responder sin embargo. –

+0

Hola Bikram, esto solo terminará cuando lo ejecute y se ejecutará la depuración que haya especificado. – Andy

1

Esto sólo va a matar el proceso wldeploy empezó, le dirá si wldeploy regresó éxito o el fracaso, y ejecutar no más de 30 segundos después de wldeploy termina

Debe ser compatible con sh, pero el/bin/sh al que tengo acceso ahora parece tener un comando de espera interrumpido.

#!/bin/ksh 
wldeploy & 
while [ ${slept:-0} -le 900 ]; do 
    sleep 30 && slept=`expr ${slept:-0} + 30` 
    if [ $$ = "`ps -o ppid= -p $!`" ]; then 
     echo wldeploy still running 
    else 
     wait $! && echo "wldeploy succeeded" || echo "wldeploy failed" 
     break 
    fi 
done 
if [ $$ = "`ps -o ppid= -p $!`" ]; then 
    echo "wldeploy did not finish in $slept seconds, killing it" 
    kill $! 
    cat output.a 
fi 
+0

Hola Pra, Esto es casi exactamente lo que estaba buscando. Usé esto para formular mi código necesario. Pero estoy enfrentando un problema extraño. Cuando ejecuto el script, "wldeploy aún en ejecución" debe mostrarse después de intervalos regulares. Pero a veces esto funciona, algunas veces no funciona. Por ejemplo, la primera vez que lo ejecuté, funcionó bien. La segunda vez, el mensaje "wldeploy aún en ejecución" no llegó. La siguiente ejecución nuevamente funcionó; y así. No pude descubrir por qué está sucediendo esto. :(¿Alguna idea? –

+0

por cierto, mi código es - ant deploy y límite = 600 deploy_check() { mientras que [$ {dormía: -0} $ -le límite]; hacer el sueño 60 && durmió = 'expr $ {dormido: -0} + 60' if [$$ =" 'ps -o ppid = -p $!' "]; luego echo" Desplegar aún ejecutándose. $ slept secs " else espera $ ! && echo "Aplicación desplegado con éxito" || echo "despliegue anómalo" ruptura fi hecho } deploy_check si [$$ = "' -o ps ppid = -p $! '"]; luego echo "La implementación no finalizó en $ dormidos segundos. Aquí está el registro". ant log echo "Presione Ctrl + C para matar. Presione Enter para continuar." leer el registro limit = 'expr $ {limit} + 300' deploy_check fi –

+0

Dennis ha encontrado la mayoría de los problemas con su script revisado en su otra Q. Respondiendo allí. – pra

0

Para la parte sin terminar el wldeploy es fácil, sólo hay que ejecutar antes

{ sleep 900; tail -f output.a; } & 

Para la parte con matarlo, es más compleja, ya que tienes determinar el PID del proceso wldeploy . La respuesta de pra es exactamente hacer eso, así que solo me referiré a eso.

Cuestiones relacionadas