Последовательность команд, отправляемых на виртуальную машину с использованием Vix, иногда дает сбой

Я сделал функцию под названием listProcesses который вызывает следующие команды Vix, в следующем порядке:

  1. VixHost_Connect
  2. VixHost_OpenVM
  3. VixVM_LoginInGuest
  4. VixVM_ListProcessesInGuest
  5. VixVM_LogoutFromGuest
  6. 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() функция выглядит так:

  1. VixHost_OpenVM
  2. VixVM_LoginInGuest
  3. VixVM_ListProcessesInGuest
  4. VixVM_LogoutFromGuest

Потому что я использую одну и ту же ручку для Vmware каждый раз, когда я запускаю listProcesses()TCP-соединение с виртуальной машиной создается, только если она еще не существует, и я могу вызывать функцию столько раз, сколько захочу.

Другие вопросы по тегам