Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

No ejecutar script de Perl si ya está corriendo

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Vie Ago 18, 2006 5:24 pm
scorpion
Perlero Nuevo
Perlero Nuevo
Registrado: 31 May 2006
Mensajes: 21
No ejecutar script de Perl si ya está corriendo Responder citando

Hola a todos...

Tengo un script de Perl que pondré en el crontab para que se ejecute cada cierto tiempo (1hora). Pero quisiera que cuando se vaya a ejecutar si todavía está corriendo, que no se vuelva a lanzar...

¿¿ Cómo podría hacer algo de esto ?? la verdad que no tengo ni idea...

Alguna ayuda por favor... Gracias por adelantado...

Saludos...

Scorpion.
Mensaje Vie Ago 18, 2006 5:30 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4212
Ubicación: Valladolid, España
Responder citando

Dos formas rápidas:
* Pedir un listado de los procesos actuales de la máquina. Si nuestro programa está entre ellos, hay que descartar el que se está ejecutando ahora. Si aún así queda otro nombre, es que ya se estaba ejecutando. Esta es la opción más segura, aunque no te garantice que el promer programa no esté corriendo porque se haya colgado.
* Otra forma sería con semáforos o con algún fichero que haga de bandera. Si a la de ejecutarlo existe un fichero bandera, es que nuestro programa ya se está ejecutando. Esto tiene el peligro de que el primer programa se puede haber muerto y no borró el fichero bandera.

Estos dos mandamientos se resumen en uno: en los sistemas linux actuales los procesos crean en /var/run un fichero con el mismo nombre que el proceso, por ejemplo, programa.pid, y dentro de él guardan el pid (número de proceso) de ese proceso. Si, a la hora de ejecutar un nuevo proceso, no existe el fichero, seguimos adelante. Si existe, lo leemos y comprobamos que el proceso con ese pid existe o no, y actuamos en consecuencia.
Mensaje Sab Ago 19, 2006 12:30 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

Cita:
Estos dos mandamientos se resumen en uno: en los sistemas linux actuales los procesos crean en /var/run un fichero con el mismo nombre que el proceso, por ejemplo, programa.pid, y dentro de él guardan el pid (número de proceso) de ese proceso. Si, a la hora de ejecutar un nuevo proceso, no existe el fichero, seguimos adelante. Si existe, lo leemos y comprobamos que el proceso con ese pid existe o no, y actuamos en consecuencia.

Recuerda que el archivo queda en /var/run esto implica que si ya lo corriste y el archivo no fue eliminado, nunca correra.
La mejor forma seria, en efecto, crear el archivo con el PID y en el mismo programa usar X flag para matar el proceso con kill.
Código:
#!/usr/bin/env perl
use strict;
#... Con Getopt::* haces lo de los flags, yo me salto esta parte
sub KillPID {
  open PID, "/var/run/miprograma.pid";
  kill (<PID>);
  close PID;
  #Esto sigue segun lo que queras hacer, en este caso todo muere.
  exit;
}

sub Int { #cuando el programa corre...
  open FL "+>/var/run/miprograma.pid";
  print FL $$;
  close FL;
}

Esto es un ejemplo, le falta pero te debe de dar una idea.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group