Я подозреваю, что Попен тайм-аут, не сказав

У меня есть некоторые трудности с моими сценариями. Цель состоит в том, чтобы запустить один или несколько контейнеров OpenVZ для выполнения некоторого теста. Эти тесты могут быть очень длинными (обычно около 3 часов).

Первый сценарий идет следующим образом, после сортировки члена очереди для запуска он выполняет:

subprocess.Popen(QUEUE_EXECUTER % queue['queue_id'], shell=True)

Где "QUEUE_EXECUTER % queue['queue_id']" - полная команда для запуска. В сценарии queue_executer это происходит следующим образом:

# Launching install
cmd = queue['cmd_install']
report_install = open(queue['report_install'], 'a')
process_install = subprocess.Popen(cmd, shell=True, stdout=report_install, stderr=subprocess.STDOUT)
process_install.wait()

# Launching test
logger.debug('Launching test')
report_test = open(queue['report_test'], 'a')
cmd = queue['cmd_test']
process_test = subprocess.Popen(cmd, shell=True, stdout=report_test, stderr=subprocess.STDOUT)
process_test.wait()

Это работает довольно хорошо, но некоторое время, а в последнее время, в большинстве случаев, выполнение останавливается. Нет ошибок в журналах или что-нибудь. Файл отчета показывает, что он остановился прямо в середине написания строки (что, как я полагаю, связано с тем, что файл неправильно закрыт на стороне Python). На стороне хоста, кажется, что OOM killer ничего не делает, и я просмотрел логи хоста, но ничего не нашел.

Два "cmd", запущенные выше, являются сценарием оболочки, который в основном устанавливает vz и выполняет на нем тестовую программу.

Итак, мой главный вопрос: я что-то упускаю, что может привести к остановке скриптов на стороне Python?

Благодарю.

РЕДАКТИРОВАТЬ: некоторые дополнительные сведения.

Команда, которая терпит неудачу, всегда является второй. Вот два примера значений команд, которые я пытаюсь выполнить: /path/vzspawncluster.sh /tmp/file web --tarball /services/pkgs/etch/releases/archive.tar.gz --create а также /path/vzlaunch.sh 172 -b trunk --args "-a -v -s --time --cluster --sql=qa3 --queue=223 --html --mail=adress@mail.com"

Сценарий vzlaunch запускает скрипт python в контейнере OpenVZ с vzctl enter ID /path/script.py где ID - это идентификатор контейнера, а /path/script.py - сценарий для контейнера.

Машина report_install и report_test - это файлы, расположенные на другой машине, доступ к которой осуществляется через общий ресурс NFS. Это не должно иметь значения, но, поскольку я действительно не знаю, что происходит, когда это терпит неудачу, я все равно отмечаю это.

Когда это терпит неудачу, процесс на контейнере умирает. Он не остается ни в каком состоянии зомби или чего-либо еще, он просто мертв. Хотя процесс в контейнере завершается неудачно, основной процесс (тот, который запускает их все) продолжается, как будто все в порядке.

Немного больше информации: я попробовал подход очистки буфера, на который указывает smci, но запись моего файла журнала продолжалась прямо в середине строки:

[18:55:27][Scripteo]       Create process '/QA/valideo.trunk/tests/756/test.py -i 10.1.11.122 --report --verbose --name 756 --...
[18:56:35][Scripteo]       Create process '/QA/valideo.trunk/tests/762/test.py -i 10.1.11.122 --report --verbose --name 762 --...
[18:57:56][Scripteo]       Create process '/QA/valideo.trunk/tests/764/test.py -i 10.1.11.122 --report --verbose --name 764 --...
[18:59:27][Scripteo]       Create process '/QA/valideo.trunk/tests/789/test.py -i 10.1.11.122 --report --verbose --name 789 --...
[19:00:44][Scripteo]       Create process '/QA/valideo.trunk/tests/866/test.py -i 10.1.11.122 --report --verbose --name 866 --...
[19:02:27][Scripteo]       Create process '/QA/valideo.trunk/tests/867/test.py -i 10.1.11.122 --report --verbose --name 867 --...
[19:04:13][Scripteo]       Create process '/QA/valideo.trunk/tests/874/t

1 ответ

Ваше намерение первым запустить process_install пока не закончится, тогда беги process_wait? (последовательно, а не многопроцессорность, верно?) Какую команду вы подозреваете для тайм-аута?

Пожалуйста, вставьте фактические значенияqueue['cmd_install'], queue['cmd_test']

(Есть ли у этих команд завершающий символ '&' или перенаправления?)

Вот мои предложения по отладке:

  • (Я не знаю OpenVZ, но я предполагаю, что вы проверили журналы и позволяет ли он запускать команды при выходе)

  • Вы работаете в UNIX? Если это так, вы можете поиграть с командами для запуска cmd в фоновом режиме, а также запустить цикл для генерации вывода, например, while(1), чтобы дотронуться до сторожевого файла, затем перевести в режим сна 10 секунд. Или ты мог cmd; touch donesentinel,

  • Попробуйте добавить цикл опроса для poll() каждого объекта Popen каждый интервал вместо wait().

  • В качестве альтернативы, напечатайте Popen.pid после его запуска, затем внешне проверьте или опросите, что процесс еще жив (например, в UNIX top -p).

  • Если ваш процесс генерирует вывод lotta, вы заметили предостережение в Popen.wait ()?Warning: This will deadlock when using stdout=PIPE and/or stderr=PIPE and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that.

  • Если вы подозреваете, что это происходит, перенаправьте один или оба из stdout, stderr на os.devnull и посмотрите, отличаются ли ваши результаты. Или посмотрите этот подход очистки буфера.

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