Runtime.getruntime().exec() не работает в Linux

У меня проблема с Java Runtime.getRuntime().exec(). Я запускаю свое java-приложение в Linux, и мне просто нужно выполнить основную задачу: скопировать и переименовать файл с помощью команды cp. Однако, похоже, это не работает.

Это мой фрагмент кода для вызова Runtime.getRuntime().exec():

String command = "cp -f '" + old_path + "' " + song_info[6] + ".mp3";                
System.out.println(command);
log.info(command);
            try{
                p = Runtime.getRuntime().exec(command);
                int returnCode;
                try {
                    returnCode = p.waitFor();
                    System.out.println("Return code = " + returnCode);
                } catch (InterruptedException ex) {
                    java.util.logging.Logger.getLogger(Import.class.getName()).log(Level.SEVERE, null, ex);
                }

            } catch(IOException e){log.error(e);}

Когда я запускаю приложение Java, команда для каждого цикла выглядит примерно так

cp -f '/temp_storage/LoveSongs/28.I miss you.mp3' /music_storage/data/0/0/1/108.mp3

Если я копирую эту строку журнала и запускаю ее в командной строке, все работает отлично. Однако результат приложения Java всегда возвращает код 1 (что указывает на сбой). Даже включая /bin/bash -c перед командной строкой, это все равно не работает.

Любое предложение, почему? Я только что установил JRE и JDK на этот сервер. Когда я набираю java -version, я получаю:

версия java "1.6.0_17" Среда выполнения OpenJDK (IcedTea6 1.7.10) (rhel-1.20.b17.el5-x86_64) 64-разрядная виртуальная машина сервера OpenJDK (сборка 14.0-b16, смешанный режим)


person Jim Raynor    schedule 21.04.2011    source источник
comment
P/S: никаких исключений не было.   -  person Jim Raynor    schedule 21.04.2011
comment
Вы пытались запустить это на любой другой ОС или только на Linux?   -  person My Head Hurts    schedule 21.04.2011
comment
@My Hed Hurts: я выполнил аналогичную задачу, вызвав файл сценария оболочки на другом сервере, и он работает нормально. Проблема только с этим.   -  person Jim Raynor    schedule 21.04.2011
comment
Возможно, это был просто простой пример чего-то более сложного, чего вы пытаетесь достичь, но зачем вам разветвлять процесс для копирования файла? Это относительно просто сделать непосредственно в java. В проекте apache commons-io даже есть служебные методы, чтобы сделать это еще проще.   -  person Brett Okken    schedule 06.12.2013


Ответы (2)


Насколько я знаю, если ваша команда имеет несколько параметров командной строки, вам нужно указать их в строке [], вы пробовали это? Кроме того, если вам нужно скопировать файлы, вы можете использовать FileUtils. или библиотеки Guava (не помню, как это там называется)

см. этот соответствующий поток о копировании файлов

person posdef    schedule 21.04.2011
comment
это правильно - система попытается найти исполняемый файл с именем «cp -f ...», а не найти исполняемый файл с именем «cp», которому она передает параметры «-f ...» - person Liv; 21.04.2011

Обладает ли пользователь, под которым запущено приложение, необходимыми разрешениями? И, судя по процессу, вы пытались получить stderr, чтобы увидеть, есть ли там что-нибудь полезное?

person DaveH    schedule 21.04.2011
comment
Спасибо, но я запускал приложение под учетной записью root, и файлы были изменены на 777. - person Jim Raynor; 21.04.2011