Вот мой рабочий процесс:
Я получаю задание из БД, запускаю несколько задач, запускаю внешнюю программу, которая читает файл и создает другой (обычно это занимает менее 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
. Это случается время от времени чаще, чем хотелось бы. Мы выполняем довольно много небольших операций ввода-вывода в программе, и жесткий диск время от времени заполняется.
Любая идея, что может происходить?
Спасибо!
РЕДАКТИРОВАТЬ: сервер — это обычный компьютер, подключенный к LogMeIn. Я боюсь, что, поскольку это обычный компьютер, он может отключить процессор / жесткий диск, когда он не используется (не уверен, что это правильная терминология). Это несколько объясняет, почему это продолжалось, как только я вошел в 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);
}
}
}
}
}
}