[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