Java Exec на Unix - PullRequest
       23

Java Exec на Unix

1 голос
/ 26 июня 2009

У меня ниже приведен код Java, работающий в Unix (как AIX, так и Linux), но он не работает. Если я запускаю этот код, файл q1.01 не сжимается, и я не получаю никаких исключений (файл q1.01 существует, и я ожидаю найти файл q1.01.Z после выполнения команды.) командная строка, если я набираю «, который сжимает», она сообщает «/ usr / bin / compress». Если я наберу команду "/ usr / bin / compress q1.01" в командной строке Unix, она будет работать нормально. Любые идеи о том, что может быть не так?

String cmd = "/usr/bin/compress q1.01";
Runtime.getRuntime().exec(cmd);

Ответы [ 5 ]

2 голосов
/ 26 июня 2009

[Позднее редактирование: проблема была в первоначальном описании; ОП передавал подстановочный знак, а не q.01. Так что мой ответ ниже неправильный, за исключением части в жирный шрифт . Я оставляю это так, комментарии после этого будут иметь смысл.]

Он пытается запустить /usr/bin/compress в качестве имени программы без аргументов.

Существует много форм метода Runtime.exec (). Вы используете версию .exec (String) , которая просто берет исполняемый файл. Вместо этого вам нужно использовать версию массива .exec (String []) , которая принимает исполняемый файл в String [0] и параметры в String [1 ..].

.exec () требует массив String для передачи аргументов.

Попробуйте

String[] cmd = new String[] { "/usr/bin/compress", "q1.01" };
Runtime.getRuntime().exec(cmd);

Обратите внимание, что .exec не вызывает локальную командную оболочку. Это означает, что мы должны сделать, среди прочего, расширение по шаблону и даже синтаксический анализ некоторых аргументов перед вызовом .exec (). Вот почему вы не можете просто передать всю свою командную строку.

1 голос
/ 26 июня 2009

Была пара проблем. Во-первых, я пытался использовать подстановочные знаки, и поскольку оболочка не вызывается, они не расширяются. Другая проблема заключалась в том, что я создал очень маленькие тестовые файлы, такие как «echo 'abc'> q1.01». Этот файл был настолько мал, что сжимать его было невозможно, и он остался один. (Глупо, я думаю, что когда я набирал команду в оболочке, я использовал другое имя файла, которое сжимало.)

Спасибо всем за ответы. Это помогло!

0 голосов
/ 26 июня 2009

Если входной поток процесса равен нулю, я подозреваю, что Java даже не смогла породить подпроцесс. Что возвращает Process # exitValue ()?

Я бы рекомендовал использовать strace, чтобы увидеть, что на самом деле происходит на уровне системных вызовов. Фактические аргументы exec () и код возврата были бы особенно интересны.

0 голосов
/ 26 июня 2009

Этот сайт может предоставить некоторые подсказки.

0 голосов
/ 26 июня 2009

Возможно, вам нужно использовать абсолютный путь к файлу. Захватите вывод, чтобы увидеть, в чем проблема - см. на этой странице для получения информации о том, как это сделать.

...