[ 
https://issues.apache.org/jira/browse/EXEC-57?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Siegfried Goeschl closed EXEC-57.
---------------------------------


Patch applied at 2011-10-10
                
> DefaultExecutor.execute() does not return even if child process terminated
> --------------------------------------------------------------------------
>
>                 Key: EXEC-57
>                 URL: https://issues.apache.org/jira/browse/EXEC-57
>             Project: Commons Exec
>          Issue Type: Bug
>    Affects Versions: 1.1
>         Environment: > uname -smr
> HP-UX B.11.23 ia64
> $ uname -smr
> Linux 2.6.18-194.3.1.el5xen x86_64
>            Reporter: Nickolay Martinov
>            Assignee: Siegfried Goeschl
>         Attachments: EXEC-57.test.patch
>
>
> When script that starts background process is synchronously executed via 
> DefaultExecutor.execute() then method never returns (until child process 
> spawned by child process terminates).
> Here is example if such script:
> echo "Going to start daemon process"
> sleep 1
> cd ./target
> nohup sleep 10 &
> sleep 1
> echo "Daemon process was started"
> Stream handler is used to grab and print output of script. As can be seen 
> from stack trace problem lies in pump threads that call InputStream.read() 
> that does not return when script that we invoke terminates. Instead it 
> returns only once process started by script terminates. 
> "Thread-3" daemon prio=10 tid=00c73a00 nid=17 lwp_id=2640638 runnable 
> [2e180000]
>    java.lang.Thread.State: RUNNABLE
>         at java.io.FileInputStream.readBytes(Native Method)
>         at java.io.FileInputStream.read(FileInputStream.java:177)
>         at 
> java.lang.UNIXProcess$DeferredCloseInputStream.read(UNIXProcess.java:313)
>         at org.apache.commons.exec.StreamPumper.run(StreamPumper.java:105)
>         at java.lang.Thread.run(Thread.java:662)
>    Locked ownable synchronizers:
>         - None
> "Thread-2" daemon prio=10 tid=005fd000 nid=16 lwp_id=2640637 runnable 
> [2e240000]
>    java.lang.Thread.State: RUNNABLE
>         at java.io.FileInputStream.readBytes(Native Method)
>         at java.io.FileInputStream.read(FileInputStream.java:199)
>         at 
> java.lang.UNIXProcess$DeferredCloseInputStream.read(UNIXProcess.java:322)
>         at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
>         at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
>         at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
>         - locked <628b1970> (a java.io.BufferedInputStream)
>         at java.io.FilterInputStream.read(FilterInputStream.java:90)
>         at org.apache.commons.exec.StreamPumper.run(StreamPumper.java:105)
>         at java.lang.Thread.run(Thread.java:662)
>    Locked ownable synchronizers:
>         - None
> "main" prio=10 tid=0046aa00 nid=1 lwp_id=-1 in Object.wait() [7fff8000]
>    java.lang.Thread.State: WAITING (on object monitor)
>         at java.lang.Object.wait(Native Method)
>         - waiting on <627e4968> (a java.lang.Thread)
>         at java.lang.Thread.join(Thread.java:1186)
>         - locked <627e4968> (a java.lang.Thread)
>         at java.lang.Thread.join(Thread.java:1239)
>         at 
> org.apache.commons.exec.PumpStreamHandler.stop(PumpStreamHandler.java:171)
>         at 
> org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:363)
>         at 
> org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:160)
>         at 
> org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:147)
> I added timeout to join() and call interrupt() but that doesnt help to kill 
> pump threads. Fortunately, these are daemon threads that do not block JVM 
> from exiting. Except from extra daemon threads this solved problem on linux. 
> But that wasnt able to prevent all hangs on HP-UX. Check following stack
> "main" prio=10 tid=00465600 nid=1 lwp_id=-1 runnable [7fffd000]
>    java.lang.Thread.State: RUNNABLE
>         at java.io.FileInputStream.close0(Native Method)
>         at java.io.FileInputStream.close(FileInputStream.java:259)
>         at 
> java.lang.UNIXProcess$DeferredCloseInputStream.close(UNIXProcess.java:298)
>         at java.io.BufferedInputStream.close(BufferedInputStream.java:451)
>         at 
> org.apache.commons.exec.DefaultExecutor.closeStreams(DefaultExecutor.java:281)
>         at 
> org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:364)
>         at 
> org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:160)
>         at 
> org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:147)
>         at 
> org.apache.commons.exec.DefaultExecutorTest.testSyncInvocationOfBackgroundProcess(DefaultExecutorTest.java:812)
> I dont have idea how this can be interrupted or timed out except that skip 
> closing streams. But in this case we'll probably leak resources.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to