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

21

Sou muito novo em bash scripts, então posso estar latindo na árvore errada, mas aqui está minha situação atual:

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

Parece que o escritório separa-se do processo do script 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 seja totalmente escrito, pois minha próxima etapa envolve o processamento desse novo pdf .

(Tanto quanto eu sei), não posso utilizar o ID do processo do soffice, porque ele pode já ter sido um processo em execução antes do início do meu script: por exemplo. O soffice já pode estar aberto para a atividade normal da GUI para outro documento / apresentação / planilha não relacionada.

O ponto crucial para mim é que, antes que eu possa 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"? ...

Peter.O
fonte

Respostas:

25

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

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

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

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' tem o arquivo 'test.py' aberto. Assim que o arquivo é fechado, ele passa para 'eco concluído' e sai.

Coloquei 'sleep 0.5' lá para que o loop não monopolize tanto a CPU. Caso contrário, ele usará 100% da CPU.

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

Obrigado a scls19fr no Fórum OOo por esta dica adorável. Você pode converter arquivos do OpenOffice Writer em PDF a partir da linha de comando usando unoconv -f pdf input.odtPara obter a desconfiguração, basta executar sudo apt-get install unoconvno terminal. (rhyshale de rhyshale.wordpress.com)

Stefano Palazzo
fonte
Embrulhe isso em um loop até e você terá um acordo.
Nick Pascucci
Fiz isso. :-) Espero que não seja um estilo terrível - não se preocupe em ler as melhores práticas. Funciona bem de qualquer maneira.
Stefano Palazzo
Obrigado Stefano ... sim, funciona ... por isso é uma resposta boa e correta. Uma observação: destacou que o que está acontecendo no soffice não é o que eu pensava. Parece que um arquivo temporário está sendo criado e o arquivo final é (talvez / provavelmente) renomeado após a conclusão ... Então, agora estou analisando isso ... nesse caso, talvez seja necessário aguardar sua * existência ... ... e obrigado pelo link em unoconv .. Eu vou olhar para ele .. (no geral, eu estou convertendo .pdf para vários ..jpegs um por página)
Peter.O
@ fred.bear que esperar até que um arquivo existe, substitua a instrução if com este: if [ -f test.odf ]. (o script do bash pode ser tão enigmático às vezes ...)
Stefano Palazzo
6
tente lsof -- /path/to/fileevitar o grep'ing'
RubyTuesdayDONO