[Cascavel-pm] NFS x flock

Rod Za rodzadra em yahoo.com
Quinta Fevereiro 9 06:14:26 PST 2006


Ednardo,

Eu tive que fazer isto uma vez e a única solução que encontrei foi fazer um "lock" manual.
Abaixo tô colocando o trecho do código que estou usando:

<code>
....
if( @ARGV == 0 ) {
  #verifica se existe outra instancia do backend rodando
  if( -e "$cups_backends_dir/$sgqi_backend.lock" ){
    log_it( 'ERR', "(E): Outra instancia do backend ja esta rodando!" );
    exit 1;
  }

  #cria um arquivo de lock para verificacao
  open( LOCKFILE, ">".$lockfile )
        or die "$sgqi_backend: Impossibilidade de criar o 'lockfile' em $cups_backends_dir!";

  # como o sgqi nao gerencia nenhum 'device', utilizamos os backends real
  # para faze-lo, enganando o CUPS:
  # chamamos cada backend real instalado sem nenhum argumento modificando
  # sua mensagem.
  foreach( glob("$cups_backends_dir/*") ){      #para cada backend listado
    next if ( /$0/ || ! -f $_ || ! -x $_ );
        my $pattern = "^(\\S+)\\s(\\S+)\\s\"([^\"]+)\"\\s\"([^\"]+)\"\$";
        foreach( qx/$_/ ){
                if( $_ =~ $pattern ){           #adiciona o pseudo-backend (SGQI) como gerenciador
                        log_it( 'DEBUG', "$1 $sgqi_backend:$2 \"$3\" \"$4 (SGQI)\"\n", 1 );
                } else {
                        log_it( 'ERR', " Linha invalida: $_\n");
                }
        }
  }

  close LOCKFILE;                               # fecha o arquivo de lock
  unlink $lockfile;                             # apaga o arquivo de lock
...
</code>

O que fiz foi simplesmente criar um arquivo com terminação .lock e verificar se este arquivo
existe. Existindo significa que outro processo já está rodando, não existindo é então criado
este arquivo (para que outro processo não rode). 

Coisa simples e que substitui o que vc precisa. Lógicamente irá substituir se vc depender
somente de seu código! :)

[]'s

Rodrigo.

--- Ednardo Lobo <ednardo em lobo.eti.br> wrote:

> H� alguma maneira de faz�-los funcionar juntos? Testei aqui e n�o funcionou:
> 
> #!/usr/bin/perl
> use strict;
> use Fcntl ':flock';
> 
> open(FH, ">>lock.txt")  or die $!;
> 
> print "------\n";
> 
> dolock();
> 
> print FH "ok\n";
> 
> print "Press any: "; <STDIN>;
> 
> unlock();
> 
> close FH;
> 
> sub dolock {
>      flock(FH,LOCK_EX);
>      seek(FH, 0, 2);
> }
> 
> sub unlock {
>      flock(FH,LOCK_UN);
> }
> 
> Alguma outra forma de implementar lock() sobre NFS com Perl? Necessito 
> que apenas um �nico processo, de v�rios, rodandando em um conjunto de 
> computadores clientes acessando arquivos num servidor NFS leiam 
> determinado arquivo. Caso um processo tente ler um arquivo j� em leitura 
> por outro, ele deve abortar a opera��o e tentar ler outro.
> 
> 
> Grato,
> 
> -- 
>      Ednardo Lobo
> 
>      www.lobo.eti.br
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
> 


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 


Mais detalhes sobre a lista de discussão Cascavel-pm