Vie Ago 18, 2006 5:24 pm
|
 |
scorpion
Perlero Nuevo

|
Registrado: 31 May 2006
Mensajes: 21
|
|
| No ejecutar script de Perl si ya está corriendo |
|
|
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. |
|
|
|

Vie Ago 18, 2006 5:30 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4226
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Sab Ago 19, 2006 12:30 pm
|
 |
creating021
Vive para Perl en Español

|
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
|
|
|
|
|
| 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. |
|

Powered by phpBB © 2001, 2005 phpBB Group
|