Яким чином у сценарії я можу визначити, чи записується файл в інший процес?


21

Я дуже новаторка сценаріїв, які б'ють, тому я можу гавкати неправильне дерево, але ось моя поточна ситуація:

У сценарії я запускаю soffice ; перетворити невідомість у формат PDF

Здається, що Soffice відривається від процесу сценарію і бродить, щоб зробити свою справу. Гаразд, це добре; GUI-програми, як правило, роблять це ...

Однак мені потрібно почекати, поки новий pdf не буде повністю написаний, оскільки наступний мій етап включає обробку цього нового PDF-файлу .

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

Суть у цьому полягає в тому, що перш ніж я можу продовжити, написання нового PDF-файлу має бути завершено ...

Чи є спосіб визначити, коли файл більше не відкривається для іншого процесу в режимі "запис"? ...

Відповіді:


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'. Як тільки файл закриється, він переходить до 'echo done' та завершується.

Я поклав туди "сон 0,5", щоб цикл не так сильно зависав процесор. В іншому випадку він буде використовувати 100% процесор.

Бонус Здається, що у файлі pdf простий спосіб вирішити проблему:

Дякуємо scls19fr на форумі OOo за цю чудову пораду. Ви можете конвертувати файли OpenOffice Writer в PDF з командного рядка, використовуючи unoconv -f pdf input.odtдля отримання unoconv, просто запустіть sudo apt-get install unoconvу терміналі. (rhyshale з rhyshale.wordpress.com)


Загорніть це в цикл до тих пір, і у вас є угода.
Нік Паскуччі

Зробив це. :-) Я сподіваюся, що це не страшний стиль - не потрудився читати кращі практики. Це добре працює в будь-якому випадку.
Стефано Палацо

Дякую Стефано ... так, це спрацьовує ... так що це хороша і правильна відповідь. Одна сторона, вона підкреслила, що те, що відбувається в софіті, не так, як я думав. Здається, що тимчасовий файл створюється, а остаточний файл (можливо / ймовірно) перейменовується після завершення ... Тож я зараз дивлюся на це ... в такому випадку мені, можливо, потрібно буде зачекати його * існування ... ... і дякую за посилання на unoconv .. Я перегляну його .. (загалом, я перетворюю .pdf у кілька ..jpegs один на сторінку)
Peter.O

@ Fred.bear чекати , поки файл не існує, то замініть Умовний оператор з цим: if [ -f test.odf ]. (Баш сценарій може бути настільки виразним часом ...)
Стефано Палаццо

6
спробуйте lsof -- /path/to/fileзамість цього уникнути grep'ing
RubyTuesdayDONO
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.