Как в скрипте можно определить, записывается ли файл в настоящее время другим процессом?

16

Я очень новичок в создании сценариев bash, поэтому я мог бы лаять неправильное дерево, но вот моя текущая ситуация:

В сценарии я запускаю soffice ; для преобразования odt в pdf

Кажется, что soffice отрывается от процесса скрипта и уходит, чтобы сделать свое дело. Хорошо, все в порядке; Приложения GUI имеют тенденцию делать это ...

Однако мне нужно подождать, пока новый pdf не будет полностью написан, так как мой следующий шаг включает в себя обработку этого нового pdf .

(Насколько я знаю) я не могу использовать идентификатор процесса soffice, потому что он, возможно, уже был запущенным процессом до запуска моего скрипта: например. soffice может быть уже открыт для нормальной работы GUI для другого несвязанного документа / презентации / электронной таблицы.

Суть вопроса для меня в том, что, прежде чем я смогу продолжить, нужно написать новую pdf ...

Есть ли способ определить, когда файл больше не открыт для другого процесса в режиме «записи»? ...

    
задан Peter.O 21.11.2010 в 04:39
источник

1 ответ

18

Вы можете использовать lsof | grep /absolute/path/to/file.txt , чтобы узнать, открыт ли файл. Если файл открыт, эта команда вернет статус 0, иначе он вернет 256 (1).

Имейте в виду, что эта команда займет секунду, так как обычно в любое время открывается много файлов.

Вы также можете использовать lsof -c gedit , например, чтобы узнать, какой файл gedit открыт. Ограничение вывода на один процесс сократит время выполнения практически до нуля.

Вот сценарий для ожидания:

#!/bin/bash

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

Это выполняется, когда процесс «pyhton3.2» получил файл «test.py». Как только файл закрыт, он переходит к «эхо-завершению» и завершает работу.

Я поставил «sleep 0.5» там, чтобы цикл не сильно зависал CPU. В противном случае он будет использовать 100% -ный процессор.

Bonus Кажется, есть простой способ заключить odt в pdf:

  

Благодаря scls19fr на форуме OOo   для этого прекрасного наконечника. Вы можете конвертировать   Файлы OpenOffice Writer для PDF из   в командной строке с использованием unoconv -f pdf input.odt Чтобы получить unoconv, просто запустите    sudo apt-get install unoconv на   Терминал.    (rhyhale of rhyshale.wordpress.com)

    
ответ дан Stefano Palazzo 21.11.2010 в 05:32
источник