Páginas

sábado, 19 de noviembre de 2011

Como comprobar si ya esta ejecutandose el mismo programa: comando PS y Gambas


Comando ps en Gambas

Algunas veces nos interesa saber si nuestro programa se esta ejecutando por una 2º vez.
En gnu/linux, tenemos el comando "ps" que nos muestra los programas que se esten ejecutando, con el argumento "a", nos va a mostrar todas los programas que se esten ejecuntado en las distintas terminales.



¿como poder usar este comando en Gambas?
Una opción es usarlo con el comando "Shell", por ejemplo, creo un modulo llamado "comprobar" y este es su codigo:

' Gambas module file
' nombre: es el nombre de la aplicacion que estamos buscando ver si esta ejecutandose 2 veces.
PUBLIC SUB ejecucion(nombre AS String) AS Boolean
DIM texto AS String
DIM buscar AS Integer
DIM buscar2 AS Integer

SHELL ("ps a >" & User.home & "/temporal.process") WAIT

texto = File.Load(User.home & "/temporal.process")
KILL User.home & "/temporal.process" ' para no dejar restos
buscar = InStr(texto, nombre)
IF buscar <> 0 THEN
buscar2 = InStr(Mid$(texto, buscar + Len(nombre), Len(texto)), nombre)
IF buscar2 <> 0 THEN
'se ha encontrado una 2º ejecucion
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
RETURN FALSE
END


En este código con la orden: SHELL ("ps a >" & User.home & "/temporal.process") WAIT
vamos a crear un archivo "temporal.proccess", que va a contener la salida que genera el "ps a" (para ello usamos el redireccionamiento ">".

luego cargamos el contenido de este archivo en la variable texto:
texto = File.Load(User.home & "/temporal.process")
Y empazamos a analizalo:
Primero buscamos si existe dentro de "texto", el contenido de la variable "nombre"
buscar = InStr(texto, nombre)
Si lo encuentra (busca es distinto a cero), procede a otro busqueda, entre el resto del texto y el total de la longitud, buscando el contenido de la variable "nombre"
buscar2 = InStr(Mid$(texto, buscar + Len(nombre), Len(texto)), nombre)
Y si busca2 tambien es distinto a cero, entonces eso indica que has por lo menos 2 veces, y por lo tanto 2 ejecuciones.

Para usar este procedimiento:
.....

if comprobar.ejecucion("hola.gambas") then  Message.Info("Se esta ejecutando por lo menos 2 veces")

.....



Descarga del Codigo fuente


Saludos.

Fuente:
https://sites.google.com/site/fpoprogramadorsistemas/sistemas-de-procesos-en-gnu-linux

Enlaces de interes:
Instr
Shell
file.load
Foro: Gambas es org: Permitir Una Sola Ejecución.