如何在Python中超时运行的jar程序

0 投票
1 回答
619 浏览
提问于 2025-04-18 10:50

我正在使用下面的 Command 类来设置一个正在运行的命令的超时时间。这个方法在执行 shell 命令时效果很好,但当我用 java -jar 来启动一个 Java 程序时,似乎无法终止这个 Java 进程。请帮帮我。

class Command(object):

cmd = None
process = None
status = None
output, error = '', ''

def __init__(self, cmd):
    # if isinstance(cmd, basestring):
    #     cmd = shlex.split(cmd)
    self.cmd = cmd
    #self.process = None

def run(self, timeout, outputfile, errfile):
    def target():
        print 'Thread started'
        try:
            print self.cmd
            open(outputfile, 'w').close()
            open(errfile, 'w').close()
            self.process = subprocess.Popen(self.cmd, shell=True, stdout = file(outputfile, 'w+'), stderr = file(errfile, 'w+')) #
            (self.output, self.error) = self.process.communicate() #
            self.status = self.process.returncode
            print self.output #"Out:'%s'" % 
            print self.error #"Err:'%s'" % 
            print 'Thread finished'
        except:
            self.error = traceback.format_exc()
            self.status = -1      
            print self.error  

    thread = threading.Thread(target=target)
    thread.start()

    thread.join(timeout)
    if thread.is_alive():
        print 'Terminating process'
        self.process.kill() #terminate
        thread.join()
    print self.status

1 个回答

1

这是因为在运行 Java 时,系统会启动一个子进程。你可以选择去掉 shell=True 这个选项,或者把你的命令改成 exec java -jar ...

关于 exec 的说明:

exec() 这一系列的函数会用一个新的进程来替换掉当前的进程。

撰写回答