Verifique o bash puro que o download está completo

1

o relato é, eu provavelmente preciso de um loop simples no bash que verifica periodicamente se o tamanho de um determinado arquivo mudou ou não desde a última verificação.

Longa história, vou baixar um arquivo meu_arquivo.txt usando o Firefox. Gostaria de executar um comando após o download ter sido concluído. O Firefox não parece fornecer chamadas dbus que eu poderia fazer uso. Existem alguns complementos com esse recurso, mas eu preciso de uma solução bastante confiável. Então eu pensei em executar um script bash que periodicamente verifica se o tamanho de meu_arquivo.txt está mudando ao longo do tempo, ou está resolvido. O arquivo é um arquivo de texto de tamanho < = 5mb e será baixado localmente , por isso é bastante confiável e o download deve ser executado linearmente (sem desconexões, problemas de servidor, etc.).

Você poderia me ajudar a escrever um roteiro tão simples? A frequência de sondar o arquivo realmente parece ser a chave para fazer a coisa funcionar efetivamente. Como eu disse, é um arquivo de texto de < = 5mb mas pode ser tão pequeno quanto 10kb, residindo em uma unidade SSD.

Além disso, talvez haja maneiras melhores de conseguir isso? Como eu disse, eu preciso de uma solução confiável que seja executada no Linux com dependências mínimas. Talvez um gerenciador de downloads? Ou qualquer daemon de monitoramento de arquivos? Ou uma API do sistema de arquivos para isso? Ou use o tempo de acesso em vez de tamanho?

    
por jabol240 04.05.2016 / 22:53

2 respostas

0

Se você quiser apenas esperar até que o arquivo fique inalterado, algo como

 size=0
 size2=$(stat --printf=%s $filename)
 while [ $size != $size2 ]
 do
   sleep 5
   size=$size2
   size2=$(stat --printf=%s $filename)
 done

Se você for capaz de escrever algum C, então usar o conjunto inotify (7) de chamadas pode ajudar; você pode acionar uma ação em um evento CLOSE.

    
por 04.05.2016 / 23:38
3

Assumindo que a única coisa que tem um arquivo aberto é o programa fazendo o download, o comando

/usr/sbin/lsof path/to/your/file | wc -l

deve retornar 2 se o arquivo ainda estiver aberto ou 0 se ninguém o tiver aberto.

Dois porque uma linha é uma lista de rótulos de coluna, a segunda é a linha de status do arquivo.

Quando o download estiver concluído, ninguém deve ter o arquivo aberto.

Você poderia usar esse resultado em sua pesquisa.

Você precisa do caminho completo para lsof , porque geralmente é um comando de administrador, portanto, mora em /usr/sbin . Provavelmente tem opções que apenas um superusuário pode usar, mas isso não é uma delas.

    
por 04.05.2016 / 23:15