🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #248

Problema script bash en cron

#248
From: 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
Technical Details
Message-ID: <hpc23e$pdl$1@news.eternal-september.org>
Path: arc1-ca.pugleaf.net!g2news2.google.com!news3.google.com!feeder1.cambriumusenet.nl!feed.tweaknews.nl!193.201.147.86.MISMATCH!news.astraweb.com!border5.a.newsrouter.astraweb.com!feeder.news-service.com!weretis.net!feeder2.news.weretis.net!feeder.eternal-september.org!eternal-september.org!.POSTED!not-for-mail

Show Full Headers
Complete Article Headers
X-Google-Thread: f86c8,d780bd9c991a508b,start
X-Google-NewGroupId: yes
X-Google-Attributes: gid646d03421f,domainid0,public,usenet
X-Google-Language: SPANISH,ASCII
Path: arc1-ca.pugleaf.net!g2news2.google.com!news3.google.com!feeder1.cambriumusenet.nl!feed.tweaknews.nl!193.201.147.86.MISMATCH!news.astraweb.com!border5.a.newsrouter.astraweb.com!feeder.news-service.com!weretis.net!feeder2.news.weretis.net!feeder.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: Seve <invalid@lafirma.es>
Newsgroups: es.comp.os.linux.programacion
Subject: Problema script bash en cron
Date: Mon, 05 Apr 2010 09:05:16 +0200
Organization: A noiseless patient Spider
Lines: 117
Message-ID: <hpc23e$pdl$1@news.eternal-september.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: quoted-printable
Injection-Date: Mon, 5 Apr 2010 07:05:18 +0000 (UTC)
Injection-Info: feeder.eternal-september.org; posting-host="D8uHK+v/x+52qnfzTG9F6g";
 logging-data="26037"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19I+q5uOTv6G/ml+e3Uud0q"
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; es-ES; rv:1.9.1.5) Gecko/20091204 Thunderbird/3.0
Cancel-Lock: sha1:9GaV6fsmEmjzOxX9JZdriMwia4k=