JDK-6587190 : (process) ProcessBuilder creates defunct processes
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.lang
  • Affected Version: 6
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: linux
  • CPU: x86
  • Submitted: 2007-07-31
  • Updated: 2011-02-16
  • Resolved: 2007-07-31
Related Reports
Duplicate :  
Description
FULL PRODUCT VERSION :
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Server VM (build 1.6.0-b105, mixed mode)

ADDITIONAL OS VERSION INFORMATION :
Linux <hostname> 2.6.9-34.ELsmp #1 SMP Fri Feb 24 16:54:53 EST 2006 i686 athlon i386 GNU/Linux


A DESCRIPTION OF THE PROBLEM :
The ProcessBuilder constructor was called using a syntax ("command param-1 param-2") instead of ("command","param-1","param-2").

When ProcessBuilder fails to find the command to be executed (perhaps due to a argument parsing change in Java 1.6.0), a defunct/zombie process is created that can be seen in the output of a "ps -ef" command on Linux.

This problem is not reproducable in Java 1.5.0

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Call ProcessBuilder() constructor with the syntax ("command param-1 param-2") instead of passing the parameters as separate arguments to the constructor.

2. Try to execute the "command" with the ProcessBuilder.start() method

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Checking the running processes does not show any defunct/zombie process.
ACTUAL -
After ProcessBuilder.start() runs, a defunct process is left behind for each invokation.

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
---------- BEGIN SOURCE ----------
import java.lang.*;
public class Zombie{
    private static void check() {
        try {
            Process p = Runtime.getRuntime().exec("ps -ef");
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line;
            while (true) {
                line = br.readLine();
                if (line == null)
                    break;
                if (line.indexOf("defunct") > 0) {
                    System.out.println(line);
                }
            }
        } catch (IOException e) { }
    }
        
    
    public static void main(String[] args) {
        System.out.println("check before");
        check();
        try {
        	ProcessBuilder pb = new ProcessBuilder("nothing-to-run param1 param2");
        	Process proc = pb.start();
        } catch (IOException e) { }
        System.out.println("check after");
        check();
    }
}
---------- END SOURCE ----------
---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
ProcessBuilder constructor should not be called with parameters and command together

Release Regression From : 5.0
The above release value was the last known release where this 
bug was not reproducible. Since then there has been a regression.

Comments
EVALUATION This appears to be a duplicate of 6474073: (process) Runtime.exec() creates zombies (sol) which was fixed in jdk 6 update 2 and jdk 7 b03
31-07-2007