Почему мой порожденный процесс все еще заставляет IntelliJ ждать? - PullRequest
0 голосов
/ 08 марта 2010

Я пытаюсь запустить сервер как часть Ant-артефакта.

Вот соответствующие строки:

    <exec dir="." executable="cmd.exe" spawn="true">
        <arg line="/c c:\Java\james-2.3.2\bin\debug.bat" />
    </exec>

Если я запускаю его с ant из командной строки, процесс запускается, и я получаю командную строку, и все выглядит нормально. Однако, если я запускаю его из IntelliJ 6, моей IDE, сборка остается активной, пока я не убью сервер.

Вот строка, которую IntelliJ использует для запуска муравья:

C:\Java\jdk1.6.0_02\bin\java -Xmx128m -Dant.home=C:\Java\apache-ant-1.7.1 -Dfile.encoding=UTF-8 -classpath "C:\Java\apache-ant-1.7.1\lib\ant-antlr.jar;C:\Java\apache-ant-1.7.1\lib\ant-apache-bcel.jar;C:\Java\apache-ant-1.7.1\lib\ant-apache-bsf.jar;C:\Java\apache-ant-1.7.1\lib\ant-apache-log4j.jar;C:\Java\apache-ant-1.7.1\lib\ant-apache-oro.jar;C:\Java\apache-ant-1.7.1\lib\ant-apache-regexp.jar;C:\Java\apache-ant-1.7.1\lib\ant-apache-resolver.jar;C:\Java\apache-ant-1.7.1\lib\ant-commons-logging.jar;C:\Java\apache-ant-1.7.1\lib\ant-commons-net.jar;C:\Java\apache-ant-1.7.1\lib\ant-jai.jar;C:\Java\apache-ant-1.7.1\lib\ant-javamail.jar;C:\Java\apache-ant-1.7.1\lib\ant-jdepend.jar;C:\Java\apache-ant-1.7.1\lib\ant-jmf.jar;C:\Java\apache-ant-1.7.1\lib\ant-jsch.jar;C:\Java\apache-ant-1.7.1\lib\ant-junit.jar;C:\Java\apache-ant-1.7.1\lib\ant-launcher.jar;C:\Java\apache-ant-1.7.1\lib\ant-netrexx.jar;C:\Java\apache-ant-1.7.1\lib\ant-nodeps.jar;C:\Java\apache-ant-1.7.1\lib\ant-starteam.jar;C:\Java\apache-ant-1.7.1\lib\ant-stylebook.jar;C:\Java\apache-ant-1.7.1\lib\ant-swing.jar;C:\Java\apache-ant-1.7.1\lib\ant-testutil.jar;C:\Java\apache-ant-1.7.1\lib\ant-trax.jar;C:\Java\apache-ant-1.7.1\lib\ant-weblogic.jar;C:\Java\apache-ant-1.7.1\lib\ant.jar;C:\Java\apache-ant-1.7.1\lib\xercesImpl.jar;C:\Java\apache-ant-1.7.1\lib\xml-apis.jar;C:\Java\jdk1.6.0_02\lib\tools.jar;C:\Program Files\JetBrains\IntelliJ IDEA 6.0\lib\idea_rt.jar" com.intellij.rt.ant.execution.AntMain2 -logger com.intellij.rt.ant.execution.IdeaAntLogger2 -inputhandler com.intellij.rt.ant.execution.IdeaInputHandler -buildfile C:\Java\Projects\CcMailer\ccmailer.xml jar

Я подозреваю, что параметр inputhandler как-то связан с проблемой, но если я запустил его сам, проблема не воспроизводится. В любом случае, у меня есть только ограниченный контроль над тем, что делает IntelliJ.

Мой вопрос: откуда IntelliJ узнает, что процесс запущен? Муравьиный процесс давно прошел. Есть ли способ запустить подпроцесс более хитрым способом, чтобы IntelliJ даже не знал, что есть что ждать?

Вот что я пробовал до сих пор: я пытался использовать команду start, например:

    <exec dir="." executable="cmd.exe" spawn="true">
        <arg line="/c start cmd /c c:\Java\james-2.3.2\bin\debug.bat" />
    </exec>

Я также пытался использовать python с кодом, подобным следующему:

import os.path
import subprocess
subprocess.Popen(["cmd.exe", "/c", "debug.bat"], stdin=open(os.path.devnull), stdout=open(os.path.devnull, "w"), stderr=subprocess.STDOUT)

Безрезультатно. Окно сборки всегда работает, пока я не убью сервер.

Есть идеи?

1 Ответ

0 голосов
/ 10 марта 2010

Я перестал выяснять это, поэтому вместо этого я настроил сервер XML RPC, который выполняет запуск и остановку, а сценарии запуска / выключения выполняют вызов XML RPC.

Код для сервера (упрощенно):

from __future__ import with_statement

from threading import Lock
from SimpleXMLRPCServer import SimpleXMLRPCServer

server = SimpleXMLRPCServer(("localhost", 8000), allow_none=True)
server.register_introspection_functions()

class JamesController(object):
    def __init__(self):
        self.lock = Lock()
        self.started = False

    def start(self):
        # starting code using subprocess

    def stop(self):
        # stopping code


server.register_instance(JamesController())
server.serve_forever()

И тогда сценарии запуска / остановки становятся примерно такими:

import xmlrpclib

s = xmlrpclib.Server('http://localhost:8000')
s.start()

Это неуклюже, и требует несколько time.sleep() вызовов, но это делает работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...