#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 /…