ProcessBuilder дает исключение "Файл не найден", когда файл существует
Работа с приложением, которое будет запускаться на веб-сервере Linux для удаления журналов из определенного каталога, однако я продолжаю получать исключение FileNotFound.
Вот код:
public static void deleteLOG() {
try {
ProcessBuilder probuilder = new ProcessBuilder("find /home/root/multicraft/servers/ -name '*.log' -delete");
probuilder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
И исключение
java.io.IOException: Cannot run program "find . -name '*CoreData*' -delete" (in directory "/home/root/multicraft/servers"): error=2, No such file or directory
at java.lang.ProcessBuilder.start(Unknown Source)
at com.mcprohosting.com.nodecleanup.Preprocess.deleteCoreData(Preprocess.java:23)
at com.mcprohosting.com.nodecleanup.handlers.CleanupHandler.executeCleanup(CleanupHandler.java:36)
at com.mcprohosting.com.main.NodeCleaner.init(NodeCleaner.java:29)
at com.mcprohosting.com.main.NodeCleaner.main(NodeCleaner.java:25)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 5 more
Однако команда cd/home/root/multicraft/servers работает отлично.
Я также пробовал:
ProcessBuilder probuilder = new ProcessBuilder("find . -name '*Backup*' -delete");
probuilder.directory(new File("/home/root/multicraft/servers/"));
probuilder.start();
Ответы
Ответ 1
Конструктор ProcessBuilder
принимает несколько строк - либо как List<String>
, либо как переменное количество аргументов, каждый из которых имеет тип String
:
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html#ProcessBuilder(java.util.List)
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html#ProcessBuilder(java.lang.String...)
У вас возникают трудности, потому что вы передали всю команду как одну строку, заставляя JVM искать программу под названием "find /home/root/multicraft/servers/ -name '*.log' -delete
", а не find
.
Вам придется отделить длинную команду от частей. Например:
ProcessBuilder pb = new ProcessBuilder("find", ".", "-name", "'*CoreData*"...);
Ответ 2
try {
ProcessBuilder probuilder = new ProcessBuilder("<Absolute Path To>/find /home/root/multicraft/servers/ -name '*.log' -delete");
probuilder.start();
} catch (IOException e) {
e.printStackTrace();
}
<Absolute Path To>
в идеале должен быть /bin или/usr/bin
ProcessBuilder probuilder = new ProcessBuilder("find /home/root/multicraft/servers/ -name '*Backup*' -delete");
probuilder.directory(new File("<Absolute Path To>"));
probuilder.start();
probuilder.directory
ожидает рабочий каталог, где find
.