5

特定のディレクトリからログを削除するために Linux Web サーバーで実行されるアプリケーションで作業していますが、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();
4

2 に答える 2

18

ProcessBuilderコンストラクターは複数の文字列を受け取ります - それぞれ type の として、または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...)

コマンド全体を 1 つの文字列として渡したため、問題が発生しています。これにより、JVM はfind /home/root/multicraft/servers/ -name '*.log' -deleteではなく " "というプログラムを検索しますfind

長いコマンドをパーツに分割する必要があります。そのような:

ProcessBuilder pb = new ProcessBuilder("find", ".", "-name", "'*CoreData*"...);
于 2013-02-08T04:46:54.590 に答える
1
    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です。

于 2013-02-08T04:51:25.440 に答える