Como, em um script, posso determinar se um arquivo está sendo gravado em outro processo?

16

Sou muito novo no bash scripting, por isso posso estar a latir na árvore errada, mas aqui está a minha situação atual:

Em um script, inicio soffice ; para converter um odt em um pdf

Parece que o soffice se destaca do processo do roteiro e se afasta para fazer suas próprias coisas. Ok, tudo bem; Aplicativos GUI tendem a fazer isso ...

No entanto, preciso esperar até que o novo pdf tenha sido totalmente escrito, pois o próximo passo envolve o processamento desse novo pdf .

(Até onde eu sei) eu não posso utilizar o ID do processo do soffice, porque pode já ter sido um processo em execução antes do meu script começar: por exemplo. O soffice pode estar aberto para a atividade normal da GUI para outro documento / apresentação / planilha não relacionado.

O ponto crucial para mim é que antes de prosseguir, a redação do novo pdf deve ser finalizada ...

Existe alguma maneira de determinar quando um arquivo não está mais aberto para outro processo no modo "gravação"? ...

    
por Peter.O 21.11.2010 / 05:39

1 resposta

19

Você pode usar lsof | grep /absolute/path/to/file.txt para ver se um arquivo está aberto. Se o arquivo estiver aberto, este comando retornará o status 0, caso contrário ele retornará 256 (1).

Esteja ciente de que esse comando levará um segundo, pois normalmente há muitos arquivos abertos a qualquer momento.

Você também pode usar lsof -c gedit , por exemplo, para ver qual arquivo o gedit abriu. Restringir a saída a um processo reduzirá o tempo de execução a praticamente nada.

Aqui está um script para aguardar:

#!/bin/bash

while :
do
    if ! [[ 'lsof -c python3.2 | grep test.py' ]]
    then
        break
    fi
    sleep 0.5
done
echo "done"

Isso é executado enquanto um processo 'pyhton3.2' possui o arquivo 'test.py' aberto. Assim que o arquivo é fechado, ele passa para 'echo done' e sai.

Eu coloquei 'sleep 0.5' lá dentro para que o loop não sobrecarregasse a CPU. Caso contrário, usará 100% cpu.

Bônus Parece haver uma maneira fácil de conventar o odt para o pdf:

  

Graças a scls19fr no Fórum OOo   para esta linda dica. Você pode converter   Arquivos do OpenOffice Writer para PDF de   a linha de comando usando unoconv -f pdf input.odt Para obter unoconv, basta executar    sudo apt-get install unoconv no   terminal.    (rhyshale de rhyshale.wordpress.com)

    
por Stefano Palazzo 21.11.2010 / 06:32