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

21

Я очень плохо знаком с сценариями Bash, так что, может быть, я лаю не на том дереве, но вот моя текущая ситуация:

В сценарии я начинаю soffice ; преобразовать ODT в PDF

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

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

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

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

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

Peter.O
источник

Ответы:

25

Вы можете использовать, 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'. Как только файл закрывается, он переходит к «эхо сделано» и завершает работу.

Я добавил туда «сон 0,5», чтобы цикл не сильно нагружал процессор. В противном случае он будет использовать 100% процессора.

Бонус Кажется, что есть простой способ записать ODT в PDF:

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

Стефано Палаццо
источник
Оберните это в цикл до, и у вас есть сделка.
Ник Паскуччи
Сделано это. :-) Надеюсь, это не страшный стиль - не удосужился прочитать лучшие практики. Это работает хорошо в любом случае.
Стефано Палаццо
Спасибо Стефано ... да, это работает ... так что это хороший и правильный ответ ... Еще одно замечание: он подчеркнул, что то, что происходит в soffice, не так, как я думал .. Кажется, что временный файл создается, и окончательный файл (возможно / вероятно) переименовывается после завершения ... Так что я сейчас смотрю на это ... в этом случае, возможно, мне просто нужно дождаться его * существования ... ... и спасибо за ссылку на unoconv .. я посмотрю на нее .. (в целом, я конвертирую .pdf в несколько ..jpegs по одному на страницу)
Peter.O
@ fred.bear ждать , пока файл не существует, то замените Условный оператор с этим: if [ -f test.odf ]. (иногда сценарий bash может быть настолько загадочным ...)
Стефано Палаццо
6
lsof -- /path/to/fileвместо этого попытайтесь избежать grep'ing
RubyTuesdayDONO