Ответ 1
Я бы предположил, что chmod
- это команда оболочки, а не исполняемый файл. Попробуйте запустить chmod
через вашу оболочку. Подробнее см. Здесь: Хотите вызвать команду оболочки Linux из Java.
У меня есть исполняемый файл (ffmpeg), который я пытаюсь запустить с помощью программы Java на Mac. Я использовал программу Java для отправки команды chmod 777 /path/to/ffmpeg
, но когда я пытаюсь запустить ffmpeg, я получаю следующую ошибку:
java.io.IOException: Cannot run program "/Users/james/WalkTheHall/ffmpeg": error=13, Permission denied
Но когда я запускаю chmod 777 /path/to/ffmpeg
из терминала самостоятельно, прежде чем открывать приложение Java, команда ffmpeg будет отлично работать в программе Java.
Есть ли разница между вызовом chmod
из программы Java и вызовом его самостоятельно? Почему это не сработает? Спасибо!
Я бы предположил, что chmod
- это команда оболочки, а не исполняемый файл. Попробуйте запустить chmod
через вашу оболочку. Подробнее см. Здесь: Хотите вызвать команду оболочки Linux из Java.
У меня была такая же проблема в моем коде. Я решил это, добавив waitFor после exec. Процесс "chmod" не завершается при выполнении следующей команды. код может выглядеть так:
p = Runtime.getRuntime.exec("chmod 777 xxx");
p.waitFor();
Runtime.getRuntime.exec("./xxx");
Да, есть разница. Когда вы выполняете команду с терминала, вы выполняете действие, и, таким образом, оно выполняется с использованием ваших учетных данных. Приложение Java запускает команду, используя разрешения Java-приложений. Это делается для предотвращения запуска приложения и последующего внесения опасных, нежелательных изменений в файловую систему. Возможно, кто-то еще может разработать и дать указания об обходном пути для этого.
В настоящее время я работаю над проектом, который также использует FFMpeg для OSX. Я храню FFMpeg в JAR и извлекаю его и устанавливаю исполняемый файл при использовании, как вы, кажется, делаете. Это то, что я делаю, и это работает.
public static void setExecutable(File file, boolean executable) { Process p = Runtime.getRuntime().exec(new String[] { "chmod", "u"+(executable?'+':'-')+"x", file.getAbsolutePath(), }); // do stuff to make sure p finishes & capture output }
Код GPL, поэтому не стесняйтесь его проверить. Его не самая лучшая база кода, и даже материал FFMpeg, возможно, слишком сложный, но он работает.
Источник доступен для просмотра http://korsakow.net
Эти два файла, в частности, могут быть вам интересны
Попробуйте следующее:
commandFile.setExecutable(true);
Process p = Runtime.getRuntime.exec(commandFile.getAbsoluteFile());