• Publicidad

No ejecutar script de Perl si ya está corriendo

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

No ejecutar script de Perl si ya está corriendo

Notapor scorpion » 2006-08-18 18:24 @808

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.
scorpion
Perlero nuevo
Perlero nuevo
 
Mensajes: 21
Registrado: 2006-05-31 16:25 @726

Publicidad

Notapor explorer » 2006-08-18 18:30 @812

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.
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

Notapor creating021 » 2006-08-19 13:30 @604

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: Seleccionar todo
#!/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.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 11 invitados

cron