Работа Хадсон зависает на Runtime.exec - PullRequest
2 голосов
/ 26 сентября 2008

Я запускаю Hudson в качестве службы Windows через Tomcat, без участия рабов. Последним этапом сборки в задании является командный файл, который вызывает некоторый код Java. В коде используется инструмент командной строки PostgreSQL psql (через Runtime.exec ()), чтобы создать базу данных на локальном компьютере и, в конечном итоге, выполнить некоторые тесты.

Задание будет выполняться до этого момента, а затем зависать до тех пор, пока не начнется создание базы данных. Если я запускаю командный файл из командной строки, он работает отлично. Я не думаю, что http://hudson.gotdns.com/wiki/display/HUDSON/Spawning+processes+from+build применимо, поскольку порожденный процесс, кажется, даже не начинает выполняться, но я новичок в этом, поэтому, пожалуйста, дайте мне знать, если я ошибаюсь.

Редактировать @anjanb: Единственная цель пакетного файла - вызвать код Java, и единственный пользовательский ввод передается в качестве аргументов командной строки, которые, как я вижу, вводятся напрямую через консольный вывод сборки.

Process Explorer показывает, что psql запускается, но, очевидно, он не выполняется, поскольку первая команда psql предназначена для создания новой базы данных, но этого не происходит.

Редактировать 2: Я получил несколько советов из списка рассылки пользователей Hudson, опробую их в понедельник и сообщу.

Редактировать 3: Java-код уже потреблял выходные потоки, я использовал эту статью при разработке кода. Я не могу понять, что происходит, поэтому я перерабатываю код, чтобы использовать JDBC для создания базы данных, вместо того, чтобы полагаться на psql и Runtime.exec ()

Ответы [ 2 ]

3 голосов
/ 27 сентября 2008

Читаете ли вы вывод процесса? Если он выдает больше данных, чем могут обрабатывать буферы ОС, вам нужно прочитать его ...

Кроме того, некоторые процессы ожидают завершения ввода. Попробуйте вызвать process.getInputStream (). Close () после запуска процесса.

Может быть, эта статья тоже интересна. Он называется «Когда Runtime.exec () не будет»: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=2

0 голосов
/ 26 сентября 2008

Существует вероятность того, что программа ожидает какого-либо пользовательского ввода. Если служба не настроена на прием пользовательских данных, она будет зависать.

Вы можете попробовать, настроив службу для разрешения USER INPUT (GUI) - это может помочь.

Также вы можете запустить Sysinternals ProcessExplorer и ProcessMonitor - они смогут узнать, где остановлено задание .BAT.

...