• Publicidad

Reiniciar un servicio en Linux usando Perl y crontab

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Reiniciar un servicio en Linux usando Perl y crontab

Notapor fjmn2001 » 2011-04-06 00:34 @065

Le explico lo que quiero hacer... La verdad le he dado vuelta a la cabeza con lo poco que sé de Perl y no lo he podido lograr. Me preguntaran que por qué no lo hago con shell y la respuesta es que no sé programar en shell.

Mi caso es el siguiente: en crontab tengo una entrada como esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
* * * * * /home/conecta/conecta_local/reinicia_squid.sh > /var/log/reinicia_squid.log
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Éste se ejecuta a cada minuto.

El contenido de "reinicia_squid.sh" es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. #!/bin/sh
  2. /home/conecta/conecta_local/reinicia_squid.pl
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Y por último, mi código en Perl "reinicia_squid.pl":
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. ##PROGRAMA PARA REINICIAR SQUID
  4. ##CADA VEZ QUE SE ACTUALICE LA
  5. ##LISTA PUBLICA DE USUARIOS.
  6.  
  7. ##ESTE SCRIPT SE EJECUTA CADA MINUTO
  8.  
  9. #Leo el tamano de mi lista publica
  10. print "Verificando cambios en l_publica.\n";
  11. system("service squid start");
  12. $lectura_new = -s "/var/www/conecta_local/l_publica";
  13.  
  14. #Leo el tamano registrado con anterioridad
  15. $lectura_ant;
  16. open (ARCHIVO,"lectura_anterior.txt");
  17. while ($lectura = <ARCHIVO>){
  18.         $lectura_ant.=$lectura;
  19. }
  20. close (ARCHIVO);
  21.  
  22. print "Lectura Anterior: ".$lectura_ant."\n";
  23. print "Nueve Lectura: ".$lectura_new."\n";
  24. ##Si las lecturas son distintas reinicio squid y reescribo a lectura_anterior.txt con el nuevo valor de lectura_new
  25. if ($lectura_new != $lectura_ant){
  26.         open (ARCHIVO,">lectura_anterior.txt");
  27.         print ARCHIVO $lectura_new;
  28.         close (ARCHIVO);
  29.         system("squid -k reconfigure");
  30.         print "Se ha reiniciado squid\n";
  31. }else{
  32. print "No se ha reiniciado squid\n";
  33. }
  34.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


La cuestión es que no reinicia la configuración squid... He intentado y nada. ¿Qué estoy haciendo mal? ¿Es necesario que lo haga en bash?
fjmn2001
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2009-06-25 15:11 @674

Publicidad

Re: Reiniciar un servicio en Linux usando Perl y crontab

Notapor explorer » 2011-04-06 05:57 @290

No es obligatorio hacerlo en shell. Para el sistema, será un proceso más, y le dará igual si lo tiene que ejecutar en bash o en perl.

Hay varios errores y detalles que tienes que cambiar.

Lo primero: no es necesario hacer un programa bash que contenga una sola línea y que llame al código Perl. Te vale con llamar directamente al código Perl. Cambia la entrada del crontab:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
* * * * * /home/conecta/conecta_local/reinicia_squid.pl > /var/log/reinicia_squid.log
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Eso sí, reinicia_squid.pl debe tener los permisos de ejecución necesarios (ponerlos con el comando chmod a 755 o 750 o 0700, según quién sea el propietario del programa). O poner 'perl' delante:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
* * * * * /usr/bin/perl /home/conecta/conecta_local/reinicia_squid.pl > /var/log/reinicia_squid.log
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Luego, en el programa hay una serie de cambios que hay que hacer.
* Línea 11. ¿Seguro que hay que iniciar el servicio squid cada minuto?

* Línea 25. El operador '!=' es para hacer comparaciones numéricas. $lectura_new sí que es un número, ya que contiene el tamaño del fichero l_publica, pero, $lectura_ant no contiene el tamaño del fichero, sino el contenido del fichero lectura_anterior.txt. Si lo que contiene es un número, entonces sí que funcionará la línea 25. En ese caso, la lectura la puedes simplificar, pasando las líneas 15 a 20 así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (ARCHIVO,"lectura_anterior.txt");
  2. my $lectura_ant = <ARCHIVO>;  # leer solo la primera línea
  3. close (ARCHIVO);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Eso sí: debemos estar seguros que debe existir el fichero lectura_anterior.txt y que debe contener un número. Si no, el programa terminará en la línea 15, por no poder abrirlo.

Recuerda que quien ejecuta el programa suele ser el usuario root, ya que es él el que ejecutó el dæmon cron:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
# ps aux|fgrep cron
root      2536  0.0  0.0   2176   660 ?        Ss    2010   0:05 /usr/sbin/cron
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
así que según eso, deberás dar permisos de ejecución a reinicia_squid.pl. Con 755 todo el mundo lo podrá ejecutar, así que es la opción más segura. O poner como propietario del programa a root.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Reiniciar un servicio en Linux usando Perl y crontab

Notapor fjmn2001 » 2011-04-06 08:46 @407

Muchas gracias por tu respuesta. Me sirvió de mucho. Mejoré el código. Pero igual no ejecutaba system (squid -k reconfigure);

Pero el error era que tenía que colocar la dirección completa para que lo pudiera ejecutar: system (/usr/sbin/squid -k reconfigure);
fjmn2001
Perlero nuevo
Perlero nuevo
 
Mensajes: 29
Registrado: 2009-06-25 15:11 @674

Re: Reiniciar un servicio en Linux usando Perl y crontab

Notapor pvaldes » 2011-04-06 09:50 @451

No soy partidario de reinventar la rueda, aunque no está mal tener una solución en Perl lo propio es tirar de bash aquí. Bastaría con dejar el siguiente script al alcance de crontab:

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. #!/bin/bash
  2. # archivo reinicia_squid.sh
  3.  
  4. actual='/var/www/conecta_local/l_publica'
  5. anterior='/mi/ruta/a/lectura_anterior'
  6. if diff $anterior $actual >/dev/null ; then
  7.   echo 'nada que hacer'
  8. else
  9.   echo 'reconfigurando squid'
  10.   squid -k reconfigure
  11.   cp $actual $anterior
  12. fi
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Reiniciar un servicio en Linux usando Perl y crontab

Notapor explorer » 2011-04-06 10:47 @491

pvaldes escribiste:lo propio es tirar de bash aquí
:?:
¿Por qué razón? (tengo curiosidad)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Reiniciar un servicio en Linux usando Perl y crontab

Notapor pvaldes » 2011-04-06 11:00 @500

Cuando usas system() estás haciendo una llamada a bash desde perl, y luego bash ejecuta el comando. El script de Perl de fjmn2001 tiene dos llamadas a bash, de hecho. Debería ser más eficiente utilizar un sólo programa para todo, especialmente en algo que va a lanzarse cada minuto.

Usar Perl tendría sentido si la comparación con Perl fuera mucho más rápida que con diff y por ahí ganaramos algo de eficacia (supongamos que hubiera que comparar dos archivos muy grandes y pesados). Si no, no veo ventajas añadidas en abrir un proceso cuya principal misión es llamar a dos terminales para correr sendos procesos de terminal y luego tener que volver a recuperar la salida de dichos terminales para hacer algo.

De todos modos no conozco en profundidad los entresijos de squid pero no me sorprendería que ya hubiera solucionado eso con una opción. Algo similar al comando watchdog que ya estuviera implementado para squid.
Última edición por pvaldes el 2011-04-06 15:39 @693, editado 1 vez en total
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Reiniciar un servicio en Linux usando Perl y crontab

Notapor explorer » 2011-04-06 12:45 @572

Ten en cuenta que en tu versión en bash estás ejecutando dos programas externos: diff y cp. El ejecutar programas externos es costoso, para el sistema operativo :)

De todas maneras, este ejemplo no nos vale para el caso de decidir si es mejor un lenguaje que otro: es tan pequeño que las diferencias son muy pequeñas.

Si sumamos lo que ocupan en recursos, los comandos bash, diff y cp, son comparables a la de solo el intérprete perl (sumando además el tiempo de carga de esos dos comandos externos). Otro tema sería medir la memoria ocupada y el tiempo de ejecución. Pero... lo dicho: la tarea es tan pequeña que no merece la pena.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado