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

Вы добавляете dispatch к роутеру? Что-то вроде:

    export default connect(mapStateToProps, dispatch => ({
dispatch,
ComponentNameHere})) (ComponentNameHere)

? Простите за плохое форматирование здесь. Использование мобильного браузера в данный момент.

8
задан vladr 26 February 2009 в 19:32
поделиться

3 ответа

Ваш сценарий Python будет требовать открыть файл для записи или для чтения? Унаследованное приложение открывает и закрывает файл между записями, или это сохраняет это открытым?

Чрезвычайно важно, чтобы мы поняли то, что унаследованное приложение делает, и чего Ваш сценарий Python пытается достигнуть.

Эта область функциональности очень зависима от операционной системы, и то, что Вы не имеете никакого контроля над унаследованным приложением только, делает вещи тяжелее, к сожалению. Существует ли pythonic или non-pythonic способ сделать, это, вероятно, будет наименьшим количеством Ваших проблем - трудный вопрос будет состоять в том, будет ли то, чего Вы пытаетесь достигнуть, возможно вообще.


ОБНОВЛЕНИЕ

Хорошо, таким образом зная (из Вашего комментария), что:

унаследованное приложение открывает и закрывает файл каждые X минуты, но я не хочу предполагать, что в t = t_0 + n*X + eps это уже закрыло файл.

затем параметры проблемы изменяются. Это может на самом деле быть сделано независимым от операционной системы способом, учитывая несколько предположений, или как комбинация зависимых от операционной системы и независимых от операционной системы методов.:)

  1. Независимый от операционной системы путь: если безопасно предположить, что унаследованное приложение сохраняет файл открытым для самое большее некоторого известного количества времени, сказать T секунды (например, открывает файл, выполняет одну запись, затем закрывает файл), и вновь открыл его более или менее каждый X секунды, где X больше, чем 2*T.
    • stat файл
    • вычтите время изменения файла из now(), получение D
    • если T <= D < X затем откройте файл и сделайте то, в чем Вы нуждаетесь с ним
    • Это может быть достаточно безопасно для Вашего приложения. Безопасность увеличивается как T/X уменьшения. На *отклоняют Вас, вероятно, придется проверить дважды /etc/ntpd.conf для надлежащего продвижения времени по сравнению с убил конфигурацию (см. ремесленника). Поскольку Windows видит MSDN
  2. Windows: кроме того (или вместо) независимого от операционной системы метода выше, можно попытаться использовать также:
    • совместное использование (блокировки): это предполагает, что программа прежней версии также открывает файл в общем режиме (обычно значение по умолчанию в Приложениях Windows); кроме того, если Ваше приложение получит блокировку так же, как унаследованное приложение делает попытку того же (состояние состязания), унаследованное приложение перестанет работать.
      • это чрезвычайно навязчиво и подвержено ошибкам. Если для и нового приложения и унаследованного приложения не нужен синхронизируемый доступ для записи в тот же файл, и Вы готовы обработать возможность унаследованного ходатайства, отклоненного, открываясь файла, не используйте этот метод.
    • попытка узнать, какие файлы открыты в унаследованном приложении, с помощью тех же методов в качестве ProcessExplorer (эквивалент *nix's lsof)
      • Вы еще более уязвимы для условий состязания, чем независимая от операционной системы техника
  3. Linux/и т.д.: кроме того (или вместо) независимого от операционной системы метода выше, можно попытаться использовать ту же технику как lsof или в некоторых системах просто проверьте, которые регистрируют символьную ссылку /proc/<pid>/fd/<fdes> точки к
    • Вы еще более уязвимы для условий состязания, чем независимая от операционной системы техника
    • очень маловероятно, что унаследованное приложение использует блокировку, но если это, блокировка не является реальной опцией, если унаследованное приложение не может обработать заблокированный файл корректно (путем блокирования, не путем сбоя - и если собственное приложение может гарантировать, что файл не останется заблокированным, блокируя унаследованное приложение в течение промежутков времени расширителя.)

ОБНОВЛЕНИЕ 2

При одобрении "проверки, имеет ли унаследованное приложение файл, открытый" (навязчивый подход, подверженный условиям состязания) затем, можно решить упомянутое состояние состязания:

  1. проверка, имеет ли унаследованное приложение открытый файл (а-ля lsof или ProcessExplorer)
  2. приостановка процесса унаследованного приложения
  3. повторение регистрации шага 1, чтобы подтвердить, что унаследованное приложение не открыло файл между шагами 1 и 2; задержка и перезапуск на шаге 1 если так, иначе продолжите двигаться к шагу 4
  4. ведение бизнеса на файле - идеально просто переименование его для последующей, независимой обработки для хранения унаследованного приложения приостановленным за минимальное количество времени
  5. возобновление процесса унаследованного приложения
7
ответ дан 5 December 2019 в 21:22
поделиться

Unix не имеет захвата файла как значения по умолчанию. Лучшее предложение, которое я имею для среды Unix, состояло бы в том, чтобы посмотреть на источники для команды lsof. Это имеет глубокие знания, о котором процессе имеют, какие файлы открываются. Вы могли использовать это в качестве основания Вашего решения. Вот источники Ubuntu для lsof.

0
ответ дан 5 December 2019 в 21:22
поделиться

Одна вещь, которую я сделал, имеют Python, очень временно переименовывают файл. Если мы можем переименовать его, то никакой другой процесс не использует его. Я только протестировал это в Windows.

0
ответ дан 5 December 2019 в 21:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: