我正在使用以下Command
类来超时运行命令。它适用于shell命令,但是当我使用命令java -jar
将它传递给Command
类来启动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
答案 0 :(得分:1)
这是因为shell启动了java的子进程。您可以删除shell=True
或将命令设为exec java -jar ...
来自exec的手册页:
exec()系列函数用新的过程映像替换当前过程映像。