[Cascavel-pm] saber se o arquivo está aberto

Ednardo Lobo ednardo em lobo.eti.br
Quinta Agosto 30 16:42:37 PDT 2007


Flávio,

Posso não estar completamente correto, mas creio estar!

Portanto, se o que você pretende fazer com arquivo é apenas renomeá-lo 
não precisa se preocupar se ele está sendo usado por outro processo - 
simplesmente o renomeie.

O fato de usar o comando "mv" não irá causar nenhum problema de 
leitura/escrita a ele por parte de algum processo. E a razão, é que um 
arquivo após aberto será referênciado por seu descritor e não pelo nome. 
E esse descritor não irá mudar após o arquivo ser renomeado.

O "logrotate" se utiliza desse princípio para rotacionar os arquivos de 
logs. E faz isto com arquivos de logs de servidores como: syslog, 
apache, ftp, mysql, etc.

Flavio Bei wrote:
> consegui uma solução assim, deu certo, mas to com dúvidas... será que
> o resultado será sempre preciso?
> 
> o código ficou + - assim
> 
> ##########################################
> #!/usr/bin/perl
> # sistema que vai buscar em um diretório um determinado arquivo
> # caso o arquivo não esteja em uso por nenhum processo ele é renomeado
> ##########################################
> 
> use strict;
> my $caminho = "/home/user/pasta/";
> my $extensao = "*.txt";
> my $completo = $caminho.$extensao;
> my @encontrados;
> my $retorno;
> my $lista;
> my $teste;
> 
> $lista = (`ls -1 $completo`);
> 
> if ($lista ne '')
> {
> @encontrados = split('\n', $lista);
> }
> 
> foreach $retorno (@encontrados) {
> 	
> $teste = (`ps xa |grep $retorno\$`);
> 		
> 	if ($teste eq '')
> 	{
> 	#processa o arquivo pois ele não está em uso por nenhum processo
> 	print ("=======>>> Altera o arquivo $retorno pois não está em uso\n");
> 	`mv $retorno $retorno.new`;	
> 	}
> 	else
> 	{
>  	#não processa o arquivo pois ele está em uso por algum processo
>   	print ("========>!!!! Não altera o arquivo $retorno\n");	
> 	}
> }
> ##############################################
> deu certo, e está rodando de boa, dai joguei na cron e ele fica
> verificando de tempos em tempos... mas não sei se é a sintaxe do ps,
> que tem hora que ele não mostra o  processo sendo executado por outro
> usuário, tem hora que mostra normal...

-- 
     Ednardo Lobo

     www.lobo.eti.br


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