• Publicidad

Cómo saber si un archivo esta siendo leído por algún program

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

Cómo saber si un archivo esta siendo leído por algún program

Notapor miguialberto » 2009-06-23 02:02 @126

Hola,

Estoy trabajando con un programa en Perl que cada minuto monitoriza una serie de recursos del sistema. Los datos son escritos en un fichero. Este fichero a su vez es leído por un segundo programa cada cierto intervalo de tiempo para trabajar con esos datos.

El caso es que tengo un problema de concurrencia con el fichero: el programa que escribe los datos no puede borrar (o no debería al menos) el fichero para insertar los datos del nuevo intervalo si en ese momento el fichero está siendo leído por el segundo programa.

Me gustaría saber si se os ocurre alguna idea para poder tratar este problema.

Lo primero que se me ha ocurrido es que igual existe alguna manera de saber si el fichero esta siendo leído por algún programa, de esta manera solo tendría que esperar a que estuviese cerrado.

Otra idea es empezar a hacer copias, pero me parece un poco engorroso.

Finalmente, otra idea es poner alguna marca en el fichero (algo así como un símbolo en la primera línea) cada vez que el programa que lo lee está accediendo y lo borra una vez ha terminado...

¡En fin, que no se qué hacer!

¡Gracias por adelantado!
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301

Publicidad

Notapor explorer » 2009-06-23 02:21 @139

Solución sencilla: usar una base de datos de verdad.

El primer programa escribe registros de actividad de las lecturas, mientras que el segundo solo tiene que preocuparse de leer desde el id del último registro leído.

La base de datos se encargará de bloqueos, accesos, y demás.

Actualización: otra forma, para saber si un fichero está siendo leído, es usar un comando como el lsof, disponible en los Linux. A lsof le pasa el nombre del fichero que quieres vigilar y te pasará qué programas lo están leyendo o escribiendo.

Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
# lsof -t /var/log/syslog
2273
11109
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

En este caso le he pedido una salida muy corta (-t) y me responde con los pid de los ficheros que, el primero, está escribiendo, y el segundo, leyendo. Con una salida más clara:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
# lsof /var/log/syslog
COMMAND   PID USER   FD   TYPE DEVICE   SIZE    NODE NAME
syslogd  2273 root    3w   REG    8,7 563420 2240240 /var/log/syslog
tail    11109 root    7r   REG    8,7 563420 2240240 /var/log/syslog
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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 miguialberto » 2009-06-23 02:36 @150

¡Gracias por la rápida contestación!

De todas formas, la solución que propones es un poco "complicada". La idea de este fichero es que no hace mucho "ruido" y el paso de datos entre un programa y otro es bastante limpia y transparente.

La solución que propones es perfecta para este caso, pero no puedo usar una base de datos ya que si quiero usar este programa en otros sistemas dependo de instalar también la BD. Me gustaría encontrar algún tipo de solución que simulara el trabajo básico de un SBD, es decir, evitar inconsistencias al leer y escribir en un fichero.

¿Alguna idea más...?
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301

Notapor miguialberto » 2009-06-23 02:39 @152

¡Opsss! Acabo de leer la "Actualización". ¡Eso me viene de lujo! Gracias de nuevo por la rápida contestación... y por los conocimientos de Linux/Unix :-). ¡Últimamente mis dudas se resuelven con comandos Linux en vez de con Perl!
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301

Notapor miguialberto » 2009-06-23 02:43 @155

Vaya, que pena, estoy trabajando en Solaris y no me encuentra el comando "lsof"... :-(

En fin, si tenéis alguna otra idea, ¡bienvenida será!
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301

Notapor miguialberto » 2009-06-23 02:45 @156

Otra idea: qué tal con el comando [flock (FILE, 2);]. Supongo que cada programa al leerlo podría ejecutar este lock y liberarlo cuando termine de leer / escribir.
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301

Notapor explorer » 2009-06-23 03:49 @200

El lenguaje Perl dispone del comando flock.

Sí que podrías usarlo.

En cuanto a usar una base de datos, se podría hacer con una SQLite, que es muy portable.

Y en cuanto a Solaris, lo sorprendente es que todavía se esté usando :)
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 miguialberto » 2009-06-23 04:00 @208

Jeje, supongo que lo de Solaris es porque estoy trabajando con unos servidores a nivel industrial y es lo que mejor se adapta.

Al final, buscando un poco más me he encontrado con el comando "fuser". Creo que es igual que "lsof" y tiene la misma función, ¡así que tema zanjado!

¡Muchas gracias por las contestaciones!
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301

Notapor Jenda » 2009-06-27 07:20 @347

No es seguro usar lsof o fuser. Sí que puedes ver si algún otro programa tiene el fichero abierto. Pero antes de abrirlo, el otro programa puede obtener la misma respuesta y abrirlo. Especialmente cuando usas un programa externo para averiguar si el fichero está abierto.

Debes usar el flock, porque con esa función puedes averiguar si el fichero está acerrojado y al mismo tiempo obtener un "lock" / acerrojarlo tú mismo.

Al final usar flock es más seguro y más sencillo.
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor miguialberto » 2009-06-29 01:43 @113

Gracias Jenda, ¡lo probaré a ver qué tal!
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301


Volver a Intermedio

¿Quién está conectado?

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