Диагностика и исправление зависящего от платформы сбоя Java Runtime.exec без сообщений

У меня есть программа Java, которая использует Runtime.getRuntime.exec для запуска скрипта Python, например:

System.out.println("Flying Circus - running monty.py on " + args[0]);
Runtime.getRuntime().exec("python monty.py " + args[0]);

Он правильно работает на моем персональном компьютере, как из файлов классов, так и из файла JAR. Однако, когда я перемещаю файл JAR на другой компьютер (с установленной Java и правильной версией Python, хотя я понятия не имею, работает ли он на официальной Java или подделке с открытым исходным кодом, такой как Gnu Common Java), вызов сценария python тихо терпит неудачу без ошибок.

Более того, когда я беру те же самые вызовы функций и помещаю их в минималистичную программу, которая вызывает только скрипт python, она работает правильно.

Я вручную проверил программу, в которой возникли проблемы, и не обнаружил никаких доказательств «ошибок», которые могли бы вызвать тихий сбой, включая плохую очистку переменных, плохое совместное использование переменных, проблемы с блокировкой / неблокированием и параллелизмом, или поточную работу.

Может ли кто-нибудь порекомендовать альтернативную функцию или функцию-оболочку, которая должна запускать данную команду и сообщать о любой форме сбоев? Сбои включают: «программа не запускалась», «команда не найдена в командной строке» и «программа вызвала исключение или завершилась с кодом, отличным от 0».

Кроме того, Runtime.exec возвращает объект Process, который вы можете использовать для получения кода выхода (а также его потоков ввода / вывода / ошибок).

Slaw 09.08.2018 17:19

Runtime.exec устарел. Не используйте это. Вместо этого используйте ProcessBuilder и вызовите его метод наследование () перед запуском процесса, чтобы все сообщения об ошибках были видны.

VGR 09.08.2018 17:50

Я реорганизовал его в ProcessBuilder, и он снова молча терпит неудачу.

user1258361 13.08.2018 21:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Разобрался в проблеме. Другой компьютер использовал подделку Java с открытым исходным кодом, вероятно, Gnu Common Java или аналогичный). У меня раньше были проблемы с сбоями программ Java по другим глупым причинам на одной из моих старых виртуальных машин Linux из-за этих подделок Java.

Установка официального Oracle Java устранила проблему. Напоминание: в Linux вы должны запустить установщик с помощью sudo, иначе он завершится с ошибкой, не имея ни малейшего представления о том, что произошло.

Другие вопросы по теме