2010-04-15 15 views
7

Me pregunto si es posible, y si es así, uno podría crear una secuencia de comandos perl que supervisa constantemente un archivo/db, y luego llamar a una subrutina para realizar el procesamiento de texto si se cambia el archivo. Estoy bastante seguro de que esto sería posible usando sockets, pero esto debe usarse para una aplicación de webchat en un sitio que se ejecuta en un host compartido, y no estoy tan seguro de que se permitan los sockets en él.¿Cómo puedo monitorizar de forma asíncrona un archivo en Perl?

La idea básica es:

  • crear un detector para un archivo de chat/base de datos
  • cuando el archivo se actualiza con un nuevo mensaje, llamar a una subrutina
  • el subprograma llamado enviará la nueva mensaje de vuelta al navegador que se mostrará

Gracias de antemano.

+0

No suena tan difícil, simplemente sondee el archivo cada pocos segundos con '-M'. –

+0

Lo único es que al sondear el archivo cada pocos segundos puede sobrecargar el servidor/ancho de banda. Sin embargo, si hay un método para simplemente monitorear su marca de tiempo, eso no requeriría demasiados recursos, debería pensar. – Hussain

Respuesta

8

Muchos sistemas operativos ejecutan un servicio que permite a las aplicaciones registrar una solicitud para recibir notificaciones cuando se actualiza un archivo o ruta. Esto generalmente se llama File Alteration Monitor. Vea la página enlazada de wikipedia para algunos sistemas disponibles. Los sistemas linux recientes usan Inotify, previamente se usaba Dnotify o gamin. OS X usa FSEvents. Windows tiene un sistema similar. No conozco ningún módulo o mecanismo que funcione multiplataforma para todos estos sistemas, pero hay módulos específicos disponibles en CPAN, como SGI::FAM y File::Tail::FAM.

+0

Hmm, File :: Tail :: FAM parece ser lo que estoy buscando, lo investigaré. Gracias. – Hussain

+3

[File :: ChangeNotify] (http://search.cpan.org/perldoc/File::ChangeNotify) espera ser uno de estos multiplataforma de uso general, pero a partir de ahora solo tiene backends para Inotify, BSD KQueues, y un método de sondeo alternativo ('stat' todos los archivos y directorios periódicamente). Sin Win32, sin FAM. :( – hobbs

1

Haría esto con un trabajo de cron y un Makefile que invocara un script de Perl. Lo más práctico es que obtenga automáticamente el momento del script de Perl como la marca de tiempo para comparar, ya que el momento del script se actualiza cuando se invoca.

+0

Esto parece prometedor, pero, lamentablemente, el sitio está en un host compartido. – Hussain

1
use POE qw(Wheel::FollowTail); 
POE::Session->create(
    inline_states => { 
     _start => sub { 
     $_[HEAP]{tailor} = POE::Wheel::FollowTail->new(
      Filename => "/var/log/thttpd.log", 
      InputEvent => "got_log_line", 
      ResetEvent => "got_log_rollover", 
     ); 
     }, 
     got_log_line => sub { 
     #print "Log: $_[ARG0]\n"; 
     parseline($_[ARG0]); 
     }, 
     got_log_rollover => sub { 
     #print "Log rolled over.\n"; 
     }, 
    } 
); 

POE::Kernel->run(); 
exit; 

#parseline()...etc. 
+0

Solo me pregunto, ¿ese módulo está incluido en un instal perl estándar, o es de CPAN? – Hussain

+0

El módulo está disponible a través de CPAN, http: // search .cpan.org/perldoc? POE – slm

Cuestiones relacionadas