这是我的工作流程:
我从数据库获得工作,运行一些任务,运行一个读取文件并生成另一个文件的外部程序(通常需要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);
}
}
}
}
}
}
最佳答案
您不会耗尽错误流。最后,您可能会做的太晚了。进程的输出缓冲区已满,进程阻塞等待在stderr
输出缓冲区中获得更多空间。
您必须为此使用单独的线程,或者(更简单)使用redirectErrorStream
使用ProcessBuilder
。