dassanov / jodconverter

Automatically exported from code.google.com/p/jodconverter
0 stars 0 forks source link

bug in managing the office process leads to execution of kill -KILL -1 under linux #104

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
If the jodconverter-core-3.0-beta-4 fails to start the libreoffice-server it 
registers the pid of the process as PID_UNKNOWN, which equals -1. If now the 
linux-processmanager is told to quit, it will call "kill -KILL -1", the -1 
resulting from PID_UNKNOWN. That results in the current user to be logged out.  
This is how we fixed the problem:

OfficeProcess.java, Line 205

public int forciblyTerminate(long retryInterval, long retryTimeout) throws 
IOException, RetryTimeoutException {
  logger.info(String.format("trying to forcibly terminate process: '" + unoUrl + "'" + (pid != PID_UNKNOWN ? " (pid " + pid  + ")" : "")));
  if(pid!=PID_UNKNOWN) {
    processManager.kill(process, pid);
    return getExitCode(retryInterval, retryTimeout);
  } else {
    return -1;
  }
}

Original issue reported on code.google.com by cola_co...@ki.tng.de on 13 Feb 2012 at 5:06

GoogleCodeExporter commented 9 years ago
Duplicate of issue #101

I'm still not clear how it can get to a state where it kills a process that 
wasn't started properly. If you have more details on this please do let me know.

Original comment by mirko.na...@gmail.com on 19 Feb 2012 at 9:56

GoogleCodeExporter commented 9 years ago
If it is still actual problem - I think it may be helpful to extend code 
provided above.

This problem occurs when jvm or server-process was killed (for example by the 
console - pkill -9 -f java), without stopping soffice process. So, when we 
start it again and OfficeProcess starts -existingPid != PID_UNKNOWN = true, and 
OfficeProcess throws exception in line 67. Because of it - long pid = 
PID_UNKNOWN. And when method forciblyTerminate(..) executes than fires 
processManager.kill(process, -1);
This was said in the first comment.

But if we only retrurns -1 when pid=PID_UNKNOWN, then all of the subsequent 
executions will not work.

So you can do something like this in forciblyTerminate(..) method:

if(pid!=PID_UNKNOWN) {
            processManager.kill(process, pid);
            return getExitCode(retryInterval, retryTimeout);
        } else {
            long blockedPid = processManager.findPid(new ProcessQuery("soffice.bin", unoUrl.getAcceptString()));
            logger.info(String.format("blocking process found: '" + blockedPid));
            if (blockedPid > -1) {
                processManager.kill(process, blockedPid);
            }
            return -1;
        }

I do not know if this is correct decision, but it works for me.

Original comment by mn.zhavz...@gmail.com on 25 Feb 2013 at 11:21