🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: es.comp.os.linux.programacion
7 messages
7 total messages Started by Seve Mon, 05 Apr 2010 07:05
Problema script bash en cron
#248
Author: Seve
Date: Mon, 05 Apr 2010 07:05
116 lines
5109 bytes
Hola

Necesito una ayudita :)

Queremos lanzar un script desde el cron en una Centos5. El script se 
llama cada minuto y aunque habitualmente termina en cuestión de 
segundos, hay veces que puede tardar varios minutos.

Como no nos interesa que el script se ejecute dos veces, hacemos un ps y 
buscamos que no estuviera en ejecución. El problema que tenemos es que 
cuando quiere da error porque el shell parece lanzarse dos veces y da un 
"falso positivo".

Mosqueados, hemos hecho el sscript que pongo más abajo y lo hemos 
colgado en el cron. Lo que hace es ver si está en el mismo nodo que en 
el que corre apache (es un cluster). Si es el mismo, saca la lista de 
procesos, busca su nombre, quita grep, se quita a sí mismo y si la lista 
está vacía, supone que no está ya en ejecución y hace lo que tenga que 
hacer (TEST_CRON.sh en este caso).

Entrada en cron:
* * * * * /usr/bin/hvs/cron/migrados/TEST_CLUSTER.sh # Test

Script:
------------------
#!/bin/bash
#
servicio="apache"
LOG=/usr/bin/hvs/cron/cron_loglocal.log

dondeestoy=`/usr/sbin/clustat | /bin/grep Local | /bin/awk '{print $1}'`
dondeesta=`/usr/sbin/clustat -s apache | /bin/grep "service:$servicio" | 
/bin/awk '{print $2}'`

/bin/echo "["`date "+%Y%m%d %H:%M:%S"`"] -1 Inicia $0" >> $LOG

if [ "$dondeestoy" == "$dondeesta" ]
then
  procesos=`/bin/ps -ef|/bin/grep $0|/bin/grep -v grep|/bin/grep -v $$`
  /bin/echo "["`date "+%Y%m%d %H:%M:%S"`"] -2 Antes procesos 
($procesos)... $0" >> $LOG
  if [ "$procesos" == "" ]
  then
   /bin/echo "["`date "+%Y%m%d %H:%M:%S"`"] -3 Se ejecuta $0" >> $LOG
   /bin/sh /mnt/cluster/apache/cron/migrado/TEST_CRON.sh
  fi
fi

/bin/echo "["`date "+%Y%m%d %H:%M:%S"`"] -4 Finaliza $0" >> $LOG

------------------

Como creo que se va a descuadrar, está descargable aquí:
http://www.vicius.org/publico/scriptecol.tar

El problema lo tenemos en "procesos". Como digo, habitualmente se lanza así:
crond -> bash
Pero cuando quiere, que es cuando falla, el script se lanza así:
crond -> bash -> bash
Y no tenemos ni idea de por qué.

Este es el log cuando va bien:
[20100405 08:42:01] -1 Inicia /usr/bin/hvs/cron/migrados/TEST_CLUSTER.sh
[20100405 08:42:01] -2 Antes procesos ()... 
/usr/bin/hvs/cron/migrados/TEST_CLUSTER.sh
[20100405 08:42:01] -3 Se ejecuta /usr/bin/hvs/cron/migrados/TEST_CLUSTER.sh
[20100405 08:42:01] -4 Finaliza /usr/bin/hvs/cron/migrados/TEST_CLUSTER.sh

Este es cuando casca:
[20100405 08:40:01] -1 Inicia /usr/bin/hvs/cron/migrados/TEST_CLUSTER.sh
[20100405 08:40:02] -2 Antes procesos (root     31305 31296  0 08:40 ? 
       00:00:00 /bin/bash /usr/bin/hvs/cron/migrados/TEST_CLUSTER.sh)... 
/usr/bin/hvs/cron/migrados/TEST_CLUSTER.sh
[20100405 08:40:02] -4 Finaliza /usr/bin/hvs/cron/migrados/TEST_CLUSTER.sh

Permisos del fichero:
-rwxr-xr-x 1 root root 737 mar 30 21:21 TEST_CLUSTER.sh

La opción de usar un fichero bandera al estilo de los scripts de init.d 
no creo que nos sirva porque el nodo se puede reiniciar "porque sí" 
(stonith) y el ficherillo se podría quedar sin borrar, dejándonos el 
"invento" parado.

¿Qué leches se nos escapa? Llevamos usando ese método años en otras 
distribuciones más antiguas sin problemas. ¿Se os ocurre otra idea mejor 
de saber si algo está en ejecución?

Gracias y un saludo.


-- 
Seve.
EChMotor#486 BPD#6 Linux user#134969
306 XT HDI 2000-... Caleidoscopio Free
Canon EOS 400D + BG-E3 - S 17-70 - S 55-200 - C 100-400L IS - Helios-44M
RMC TK 24 F2.8 - Dryzone 200 - Toploader 70 AW - Canon Speedlite 430EX
seve < @ > vicius < . > org
Las FAQ de es.comp.hardware.misc en http://www.escomphardwaremisc.org
Re: Problema script bash en cron
#249
Author: Gonzalo Pérez de Olaguer Córdoba
Date: Mon, 05 Apr 2010 14:38
14 lines
1533 bytes
Hola Seve <invalid@lafirma.es>
el Mon, 05 Apr 2010 09:05:16 +0200 escribiste:

> Hola
> 
> Necesito una ayudita :)
> 

Añade la opción set -x al principio del script y prueba
de nuevo. Obtendrás más info.

-- 
Gonzalo Pérez de Olaguer Córdoba <gpoc@iies.es> --- www.gpoc.es
PGP key 2861C704 --- F206 5671 6789 425D 111C  1302 214F 1934 2861 C704
Re: Problema script bash en cron
#250
Author: Pascal J. Bourguignon
Date: Mon, 05 Apr 2010 18:11
35 lines
2709 bytes
Seve <invalid@lafirma.es> writes:

> Hola
>
> Necesito una ayudita :)
>
> Queremos lanzar un script desde el cron en una Centos5. El script se
> llama cada minuto y aunque habitualmente termina en cuesti�n de
> segundos, hay veces que puede tardar varios minutos.
>
> Como no nos interesa que el script se ejecute dos veces, hacemos un ps
> y buscamos que no estuviera en ejecuci�n. El problema que tenemos es
> que cuando quiere da error porque el shell parece lanzarse dos veces y
> da un "falso positivo".
>
> Mosqueados, hemos hecho el sscript que pongo m�s abajo y lo hemos
> colgado en el cron. Lo que hace es ver si est� en el mismo nodo que en
> el que corre apache (es un cluster). Si es el mismo, saca la lista de
> procesos, busca su nombre, quita grep, se quita a s� mismo y si la
> lista est� vac�a, supone que no est� ya en ejecuci�n y hace lo que
> tenga que hacer (TEST_CRON.sh en este caso).


Tenemos el problema general en unix para saber si un programa dado esta
ejecutandose.  En linux, se puede usar lockf(1):

--------------------(test-cluster)-------------------------------------
#!/bin/bash
exc flock -x -n "/var/lock/test-cluster/pid.lock" -c test-cluster-do-it
-----------------------------------------------------------------------
      


-- 
__Pascal Bourguignon__
Re: Problema script bash en cron
#251
Author: Seve
Date: Mon, 05 Apr 2010 22:16
27 lines
2339 bytes
El 05/04/2010 20:11, Pascal J. Bourguignon escribió:
> Seve<invalid@lafirma.es>  writes:
>> Como no nos interesa que el script se ejecute dos veces, hacemos un ps
>> y buscamos que no estuviera en ejecución. El problema que tenemos es
>> que cuando quiere da error porque el shell parece lanzarse dos veces y
>> da un "falso positivo".

> Tenemos el problema general en unix para saber si un programa dado esta
> ejecutandose.  En linux, se puede usar lockf(1):

Ostras, no había caído en usar bloqueos sobre ficheros en lugar de 
ficheros bandera. Una idea estupenda. Mañana probamos :D

Muchas gracias.

-- 
Seve.
EChMotor#486 BPD#6 Linux user#134969
306 XT HDI 2000-... Caleidoscopio Free
Canon EOS 400D + BG-E3 - S 17-70 - S 55-200 - C 100-400L IS - Helios-44M
RMC TK 24 F2.8 - Dryzone 200 - Toploader 70 AW - Canon Speedlite 430EX
seve < @ > vicius < . > org
Las FAQ de es.comp.hardware.misc en http://www.escomphardwaremisc.org
Re: Problema script bash en cron
#252
Author: Seve
Date: Mon, 05 Apr 2010 22:17
27 lines
2242 bytes
El 05/04/2010 16:38, Gonzalo Pérez de Olaguer Córdoba escribió:
> Hola Seve<invalid@lafirma.es>
> el Mon, 05 Apr 2010 09:05:16 +0200 escribiste:
>
>> Hola
>>
>> Necesito una ayudita :)

> Añade la opción set -x al principio del script y prueba
> de nuevo. Obtendrás más info.

Ok, mañana probamos a ver qué sale, porque es curioso que unas veces 
vaya y otras no y sobre todo que falle en las Centos 5 y no nos haya 
fallado en las otras máquinas más antiguas.



-- 
Seve.
EChMotor#486 BPD#6 Linux user#134969
306 XT HDI 2000-... Caleidoscopio Free
Canon EOS 400D + BG-E3 - S 17-70 - S 55-200 - C 100-400L IS - Helios-44M
RMC TK 24 F2.8 - Dryzone 200 - Toploader 70 AW - Canon Speedlite 430EX
seve < @ > vicius < . > org
Las FAQ de es.comp.hardware.misc en http://www.escomphardwaremisc.org
Re: Problema script bash en cron
#253
Author: dx
Date: Tue, 06 Apr 2010 09:12
7 lines
1437 bytes
pjb@informatimago.com (Pascal J. Bourguignon) writes:
> [...]
> exc flock -x -n "/var/lock/test-cluster/pid.lock" -c test-cluster-do-it

Vaya, no conocía sobre flock. Gracias.

dx
Re: Problema script bash en cron
#254
Author: jose maria
Date: Tue, 06 Apr 2010 16:19
33 lines
2302 bytes
Seve wrote:

> Hola
> 
> Necesito una ayudita :)
> 
> Queremos lanzar un script desde el cron en una Centos5. El script se
> llama cada minuto y aunque habitualmente termina en cuesti�n de
> segundos, hay veces que puede tardar varios minutos.
> 
> Como no nos interesa que el script se ejecute dos veces, hacemos un ps y
> buscamos que no estuviera en ejecuci�n. El problema que tenemos es que
> cuando quiere da error porque el shell parece lanzarse dos veces y da un
> "falso positivo".
> 
> Mosqueados, hemos hecho el sscript que pongo m�s abajo y lo hemos
> colgado en el cron. Lo que hace es ver si est� en el mismo nodo que en
> el que corre apache (es un cluster). Si es el mismo, saca la lista de
> procesos, busca su nombre, quita grep, se quita a s� mismo y si la lista
> est� vac�a, supone que no est� ya en ejecuci�n y hace lo que tenga que
> hacer (TEST_CRON.sh en este caso).
> 
> Entrada en cron:
> * * * * * /usr/bin/hvs/cron/migrados/TEST_CLUSTER.sh # Test
> 
> 

* Si tienes muchos y distintos, como es mi caso, en cron u otros front-ends, 
los lanzo como argumento con el del enlace, invitado invitado para acceder, 
me evita programarlo en los propios scripts, con la opcion de especificar un 
usuario o pararlos de forma ordenada, independientemente del script.

https://doc.usernix.org:4443/index.php?module=fileview&objectId=7401
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads