Последовательность команд, отправляемых на виртуальную машину с использованием Vix, иногда дает сбой
Я сделал функцию под названием listProcesses
который вызывает следующие команды Vix, в следующем порядке:
- VixHost_Connect
- VixHost_OpenVM
- VixVM_LoginInGuest
- VixVM_ListProcessesInGuest
- VixVM_LogoutFromGuest
- VixHost_Disconnect
Обратите внимание, что я не звоню VixVM_PowerOn
потому что я включаю виртуальную машину вручную.
Функция listProcesses()
написано на С, но я экспортирую его как .pyd
файл для использования с Python.
В интерпретаторе Python я запускаю следующий код:
from myModule import listProcesses
for i in xrange(1000):
print listProcesses()
Функция listProcesses()
дает мне выделенный вывод (список строк, представляющих имена процессов, запущенных внутри виртуальной машины) для первых ~30 итераций for
цикл, но после этого он начинает печатать пустой список.
Я использовал отладчик в Visual Studio 2012 для исследования, и похоже, что после ~30 итерации for
петля, функция VixVM_LoginInGuest()
возвращает ошибку 3006
, В документации Vix эта ошибка означает "Виртуальная машина должна быть включена".
Я проверил, и виртуальная машина включена и отвечает, и VmwareTools все еще работает внутри виртуальной машины.
Я хотел бы добавить, что я выпускаю все маркеры в соответствии с рекомендациями документации. Кроме того, если это поможет, если я приостановлю выполнение скрипта python после того, как начну получать сообщение об ошибке, и перезапущу виртуальную машину, скрипт начнет печатать полученный вывод еще для ~30 (в зависимости от хоста, на котором я запустил в сценарии, это может быть целых 80) раз, а затем он снова начинает печатать пустой список.
Я хотел бы понять, почему эта проблема может возникнуть.
РЕДАКТИРОВАТЬ: После того, как я исследовал дальше, я заметил, что функция VixHost_OpenVM
создает TCP-соединение с виртуальной машиной, и соединение никогда не закрывается. Когда число подключений достигает определенного числа, ОС, вероятно, запрещает любое новое подключение, исходящее из моего сценария. Есть ли способ закрыть неиспользуемое соединение, не закрывая скрипт?
1 ответ
Я нашел ответ на свой вопрос, и, поскольку похоже, что никто не собирается на него отвечать, я сам опубликую ответ для людей, которые могут столкнуться с этой проблемой в будущем.
Проблема была в том, что я позвонил VixHost_Connect
каждый раз, когда я запускал функцию, и из-за этого функция VixHost_OpenVM
создаст новое (TCP) соединение с виртуальной машиной каждый раз. После нескольких звонков я достигну предела TCP-соединения, установленного операционной системой, и продолжу звонить VixHost_OpenVM
потерпит неудачу
Решение состоит в том, чтобы вызвать функцию VixHost_Connect
в initmodule()
и сохраните дескриптор как глобальную переменную, которую могут использовать другие методы. После того, как я это сделал, мой listProcesses()
функция выглядит так:
- VixHost_OpenVM
- VixVM_LoginInGuest
- VixVM_ListProcessesInGuest
- VixVM_LogoutFromGuest
Потому что я использую одну и ту же ручку для Vmware каждый раз, когда я запускаю listProcesses()
TCP-соединение с виртуальной машиной создается, только если она еще не существует, и я могу вызывать функцию столько раз, сколько захочу.