in agent/src/jetbrains/buildServer/swabra/processes/LockedFileResolver.java [75:130]
public boolean resolve(@NotNull File f, boolean kill, @Nullable Listener listener) {
Collection<ProcessInfo> processes = getLockingProcesses(f, listener);
if (processes == null) return false;
if (processes.isEmpty()) {
log("No processes found locking files in directory \"" + f + "\"", false, listener);
return false;
} else {
final StringBuilder sb = new StringBuilder("Found ").append(StringUtil.pluralize("process", processes.size())).append(" locking files in directory \"").append(f).append("\":");
appendProcessInfos(processes, sb);
log(sb.toString(), true, listener);
}
List<ProcessInfo> ignored = new ArrayList<>();
if (kill) {
log("Will try to kill locking processes", false, listener);
for (final ProcessInfo p : processes) {
if (isIgnored(p)) {
ignored.add(p);
log("The following process and it's subtree has been skipped to avoid stopping of TeamCity agent:\n" + getProcessString(p), true, listener);
continue;
}
try {
if (ProcessTreeTerminator.kill(p.getPid(), new KillProcessDetails(new ProcessFilter() {
@Override
public boolean accept(@NotNull ProcessNode processNode) {
return !isIgnored(processNode.getPid());
}
}, true))) {
log("Process killed:\n" + getProcessString(p), false, listener);
} else {
logFailedToKill(p, null, listener);
}
} catch (Exception e) {
logFailedToKill(p, e.getMessage(), listener);
}
}
Collection<ProcessInfo> aliveProcesses = getLockingProcesses(f, listener);
if (aliveProcesses == null) return false;
List<ProcessInfo> processesLeft = new ArrayList<ProcessInfo>();
processesLeft.removeAll(ignored);
if (processesLeft.isEmpty()) return true;
final StringBuilder sb
= new StringBuilder("Failed to kill some of the ").append(StringUtil.pluralize("process", processesLeft.size())).append(" locking files in directory \"").append(f).append("\":");
appendProcessInfos(processesLeft, sb);
log(sb.toString(), true, listener);
}
return false;
}