Como saber de um arquivo GZip ainda está sendo escrito enquanto está sendo copiado

3

Estou obtendo um arquivo gzip em um caminho.

Caminho da pasta de entrada:

<server>/input_gate

Eu quero verificar se o arquivo GZIP que estou recebendo nesta pasta é válido? Eu usei o seguinte comando. É bom encontrar um arquivo gzip válido ou não?

gzip -t -v <file_name>

Mas quando a mudança está acontecendo, o arquivo é mostrado como um arquivo inválido. Mas, na verdade, o arquivo é válido quando o movimento é feito. Existe alguma maneira de descobrir se o arquivo que eu recebo é um arquivo completamente movido ou movimento ainda está em andamento?

    
por Raj 01.02.2015 / 00:10

2 respostas

0

De acordo com esta resposta em "Ask Ubuntu" você pode usar lsof (lista de arquivos abertos) para verificar se o arquivo está aberto:

lsof | grep <server>/input_gate
    
por 01.02.2015 / 00:19
0

Usando lsof

Para testar se algum processo tem um arquivo aberto, diga path/to/input_gate , execute o comando:

lsof path/to/input_gate

Isso sairá com o código 0 se houver um processo usando o arquivo e o código 1 se nenhum processamento estiver usando (ou ocorreu um erro). Este código de saída pode ser usado pelos comandos do shell.

Teste

Para testar isso, vamos criar um processo para abrir nosso arquivo:

sleep 10 >>path/to/input_gate &

Isso manterá o arquivo aberto por 10 segundos. Para testar lsof , execute rapidamente o seguinte comando:

$ if lsof path/to/input_gate >/dev/null; then echo "In use"; else echo "Not in use"; fi
In use

Aguarde 10 segundos e tente novamente:

$ if lsof path/to/input_gate >/dev/null; then echo "In use"; else echo "Not in use"; fi
Not in use

Aguardando até o arquivo estar pronto

Se você quiser esperar até que nenhum outro processo esteja usando o arquivo:

while lsof path/to/input_gate >/dev/null; do sleep 1; done; echo "Finally, not in use"

Usando inotifywait

Se o seu sistema suporta inotifywait (um sistema linux deveria), então é possível procurar por eventos próximos no arquivo de interesse:

inotifywait  "path/to/input_gate" -e close

O comando acima irá bloquear até que algum processo tenha fechado o arquivo.

A vantagem desta abordagem é que elimina o polling.

A desvantagem desta abordagem é que ela irá notificá-lo na primeira vez que algum processo fecha o arquivo e isso pode não ser a mesma coisa que todos os processos que fecharam o arquivo.

    
por 01.02.2015 / 01:47