Как установить тайм-аут для запущенной jar-программы в python

#java #python #process

#java #python #процесс

Вопрос:

Я использую следующий Command класс для тайм-аута запущенной команды. Он отлично работает с командой оболочки, но когда я использую команду 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
  

Комментарии:

1. Какую ОС вы используете?

2. Linux, точнее, Ubuntu.

Ответ №1:

Это потому, что оболочка запускает дочерний процесс для java. Вы можете либо удалить shell=True , либо сделать так, чтобы ваша команда была exec java -jar ...

Со страницы руководства exec:

Семейство функций exec() заменяет текущий образ процесса новым образом процесса.

Комментарии:

1. Спасибо! это exec работает. Но удаление shell=True приведет к ошибкам.

2. Привет! Знаете ли вы альтернативу exec в Windows?

3. Я не знаю опции Windows. serverfault.com/questions/315077 /…