0

これが私のワークフローです:

DB からジョブを取得し、いくつかのタスクを実行し、ファイルを読み取って別のファイルを生成する外部プログラムを実行します (通常、これには 10 秒もかかりません)。コードは次のとおりです。

Process p = Runtime.getRuntime().exec(prog, null, new File(path));

BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

String s;
String errorString = "";
while((s = stdInput.readLine()) != null) {
    if(s.toLowerCase().contains("error")) {
        Log.writeLog("error: " + s);
        errorString += s + "\r\n";
    }
}

if(errorString.length() > 1) {
    Emailer.email(name + "*" + errorString, "ERROR");
}

while((s = stdError.readLine()) != null) {
    Log.writeLog("ERROR: " + s);
}

ただし、スニペットはハングしました。LogMeIn を介してコードが実行されるサーバーを制御します。ログインすると、プロセスのブロックが解除され (合計実行時間は約 280 秒)、続行されました。プロセスは結果を生み出しませんでしたERROR。これは、私たちが望んでいるよりも頻繁に発生します。プログラムでかなりの小さな IO 操作を実行すると、ハードドライブが時々いっぱいになります。

何が起こっているのでしょうか?

ありがとう!

編集: サーバーは、LogMeIn に接続されている通常のコンピューターです。私の懸念は、これは通常のコンピューターであるため、使用していないときに CPU/ハード ドライブの電源がオフになる可能性があることです (正しい用語がわからない)。これは、LogMeIn にログインしてコンピュータにアクセスできるようになると、なぜ続行するのかを説明するものです。

EDIT2: プロセスの直後に、これを実行します。そして、これも途方もない時間ハングします (通常は 5 秒、200 秒以上かかります)。ハードドライブが仮眠を取ることに決めたと思いますか?

private void cleanup(String path) {

    File srcPath = new File(path);
    File[] files = srcPath.listFiles();

    if(files != null) {
        for(File file : files) {
            if(file.isDirectory()) {
                cleanup(file.getAbsolutePath());
            } else {
                if(file.getAbsolutePath().endsWith(".original")) {
                    String fileName = file.getAbsolutePath().substring(0,     file.getAbsolutePath().lastIndexOf(".original"));
                    IO.delete(fileName);
                    if(!IO.renameFile(file.getAbsolutePath(), new File(fileName).getAbsolutePath())) {
                        Log.writeLogSevere("Failed to rename file, this could be a problem..." + fileName);
                    } else {
                        Log.writeLog("Cleaned up: " + fileName);
                    }
                }
            }
        }
    }
}
4

2 に答える 2

1

エラーストリームを排出していません。あなたは最後にそれをしますが、それはしばしば手遅れになるかもしれません. プロセスの出力バッファーがいっぱいになり、プロセスがブロックされ、stderr出力バッファーにさらにスペースを確保するために待機します。

そのために別のスレッドを使用するか、(はるかに簡単に) を使用する必要がありredirectErrorStreamますProcessBuilder

于 2013-08-07T14:21:24.767 に答える