【问题标题】:Why is my spawned process still causing IntelliJ to wait?为什么我生成的进程仍然导致 IntelliJ 等待?
【发布时间】:2010-03-08 16:01:06
【问题描述】:

我正在尝试将服务器作为 Ant 工件的一部分启动。

以下是相关行:

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

如果我从命令行使用ant 启动它,则会生成一个进程,我会收到一个命令提示符,一切似乎都很好。但是,如果我从我的 IDE IntelliJ 6 启动它,构建会一直保持活动状态,直到我终止服务器。

这是 IntelliJ 用来启动 ant 的代码:

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 怎么知道进程正在运行? Ant 进程早已不复存在。有没有办法以更偷偷摸摸的方式启动子进程,这样 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)

无济于事。构建窗口始终保持不变,直到我终止服务器。

有什么想法吗?

【问题讨论】:

    标签: python ant intellij-idea subprocess


    【解决方案1】:

    我已经放弃了解决这个问题,所以我设置了一个 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() 调用,但它可以完成工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-14
      • 2011-12-24
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      相关资源
      最近更新 更多