У меня есть демон на основе Python, который предоставляет REST-подобный интерфейс через HTTP для некоторых инструментов командной строки .Общая природа инструмента заключается в том, чтобы принять запрос, выполнить какое-либо действие командной строки, сохранить измененную структуру данных на диск и вернуть некоторые данные вызывающей стороне.При запуске демона создается вторичный поток, который периодически просматривает данные на диске и выполняет некоторую очистку, основываясь на том, что находится в данных.
Это прекрасно работает, если диск, на котором находятся данные, является локальнымдиск на машине Linux.Если вы переключаетесь на диск, смонтированный по NFS, демон начинает нормально работать, но со временем ресурс, смонтированный по NFS, «исчезает», и демон больше не может определить, где он находится на диске, с такими вызовами, как os.getcwd()
.Вы начнете видеть это, регистрируя ошибки как:
2011-07-13 09:19:36,238 INFO Retrieved submit directory '/tech/condor_logs/submit'
2011-07-13 09:19:36,239 DEBUG CondorAgent.post_submit.do_submit(): handler.path: /condor/submit?queue=Q2%40scheduler
2011-07-13 09:19:36,239 DEBUG CondorAgent.post_submit.do_submit(): submitting from temporary submission directory '/tech/condor_logs/submit/tmpoF8YXk'
2011-07-13 09:19:36,240 ERROR Caught un-handled exception: [Errno 2] No such file or directory
2011-07-13 09:19:36,241 INFO submitter - - [13/Jul/2011 09:19:36] "POST /condor/submit?queue=Q2%40scheduler HTTP/1.1" 500 -
Необработанное исключение разрешает демону больше не видеть диск.Любые попытки выяснить текущий рабочий каталог демона с os.getcwd()
на этом этапе потерпят неудачу.Даже попытка перейти в корень NFS-монтирования /tech
не удастся.Все это время методы logger.logging.*
успешно записывают журнал и отлаживают сообщения в файл журнала, расположенный на смонтированном NFS-ресурсе по адресу /tech/condor_logs/logs/CondorAgentLog
.
Диск наиболее определенно все еще доступен.Существуют и другие демоны на основе C ++, которые читают и пишут с гораздо более высокой частотой на этом ресурсе во время работы демона на основе Python.
Я зашел в тупик, отлаживая эту проблему.Поскольку он работает на локальном диске, общая структура кода должна быть хорошей, верно?Есть что-то в смонтированных на NFS общих ресурсах и моем коде, которые несовместимы, но я не могу сказать, что это может быть.
Существуют ли особые соображения, которые необходимо реализовать при работе с долго работающим демоном Python, которыйбудете часто читать и записывать в файловый ресурс, смонтированный в NFS?
Если кто-то захочет увидеть код, то часть, которая обрабатывает HTTP-запрос и записывает выбранный объект на диск, находится в github. здесь .И часть, которую подпоток использует для периодической очистки содержимого диска с помощью чтения маринованных объектов: здесь .