[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