> Date: Mon, 2 Feb 2015 10:45:44 +0100
> From: siegfried.goes...@it20one.com
> To: user@commons.apache.org
> Subject: Re: [exec] Can't kill process?
> 
> Mhmm - see 
> https://msdn.microsoft.com/en-us/library/windows/desktop/ms686722(v=vs.85).aspx

MG>dont know if calling Paul Allen out of retirement to get this fixed would be 
an immediate solution
MG>Are you envisioning commons collection (possibly TreeList) which contains 
all process handles?
https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/list/TreeList.html

MG>walking thru parent and all Child handles to Call TerminateProcess with 
WaitForSingleObject on each handle?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms687036%28v=vs.85%29.aspx
MG>Thoughts?
> 
> On 02.02.15 10:23, Peter Ashford wrote:
> > So is there no way to make something like this work?
> >
> > ps: 4770092 doesn't bring anything up in the Java bug database.  And that
> > killing-child-process anchor doesn't seem to exist either.
> >
> >
> >
> > On 2 February 2015 at 21:28, siegfried.goes...@it20one.com <
> > siegfried.goes...@it20one.com> wrote:
> >
> >> Hi Peter,
> >>
> >> I think you are starting two processes under Windows
> >>
> >> * one command line interpreter
> >> * the second one is the "hg log" command which is a child process of the
> >> command line interpreter
> >>
> >> When you kill the process the command line interpreter is killed but the
> >> second one (child process) is very likely still running since Windows has
> >> no real concept of a parent pid
> >>
> >> * http://commons.apache.org/proper/commons-exec/faq.html#
> >> killing-child-processes
> >> * http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4770092
> >>
> >> Cheers,
> >>
> >> Siegfried Goeschl
> >>
> >>
> >>
> >> On 02.02.15 04:35, Peter Ashford wrote:
> >>
> >>> Hi there
> >>>
> >>> I'm trying to use ExecuteWatchDog.destroyProcess() to kill a running
> >>> process but it doesn't seem to work.  I've pasted a minimal test case
> >>> below
> >>> which shows what I'm trying to do: it creates a frame with a text area
> >>> which the process output is echoed to.  I've set it up so that ctrl + c
> >>> should kill the running process but it doesn't appear to work.
> >>>
> >>> This test case changes directory to y:\ (my mapped drive where my
> >>> mercurial
> >>> repository lives) and does a "hg log" which runs for a long time on my
> >>> machine, giving me time to kill the process).  If you wanted to run this
> >>> test, you'd have to choose a directory and long running process
> >>> appropriate
> >>> for your machine.
> >>>
> >>> I've confirmed that the break signal is being received - there's a write
> >>> to
> >>> std.err in the code that executes correctly.
> >>>
> >>> If anyone could help me with this, i'd really appreciate it!
> >>>
> >>> Cheers!
> >>>
> >>> Peter.
> >>>
> >>> ----------------
> >>>
> >>> package jcon2;
> >>> import java.awt.Dimension;
> >>> import java.awt.event.KeyEvent;
> >>> import java.awt.event.KeyListener;
> >>> import java.io.BufferedOutputStream;
> >>> import java.io.File;
> >>> import java.io.IOException;
> >>> import java.io.OutputStream;
> >>> import javax.swing.JFrame;
> >>> import javax.swing.JScrollPane;
> >>> import javax.swing.JTextArea;
> >>> import javax.swing.ScrollPaneConstants;
> >>> import javax.swing.UIManager;
> >>> import javax.swing.text.Document;
> >>> import org.apache.commons.exec.*;
> >>>
> >>> public class Test implements KeyListener {
> >>>       JFrame    frame;
> >>>       JTextArea text;
> >>>       Document  textDoc;
> >>>       boolean   breakFlag   = false;
> >>>       boolean   execProcessRunning;
> >>>       File      currentDir  = new File("y:\\");
> >>>       BufferedOutputStream execIn;
> >>>
> >>>       class JCStream extends OutputStream {
> >>>           public void write(int b) throws IOException {
> >>>               writeCon(new String(new byte[]{ (byte) b}));
> >>>               moveCaretToEnd();
> >>>           }
> >>>       }
> >>>
> >>>       public Test(){
> >>>           frame = new JFrame("JCon2");
> >>>           text  = new JTextArea();
> >>>           textDoc = text.getDocument();
> >>>           JScrollPane scroller = new JScrollPane(text);
> >>>
> >>> scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.
> >>> HORIZONTAL_SCROLLBAR_NEVER);
> >>>           frame.add(scroller);
> >>>           frame.setPreferredSize(new Dimension(600,800));
> >>>           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
> >>>           text.addKeyListener(this);
> >>>           frame.pack();
> >>>           frame.setVisible(true);
> >>>       }
> >>>
> >>>
> >>>       /**
> >>>        * Write to the console
> >>>        * @param str The text to write
> >>>        */
> >>>       private void writeCon(String str){
> >>>           try {
> >>>               if(str != null && str.length()>0){
> >>>                   textDoc.insertString(textDoc.getLength(), str, null);
> >>>               }
> >>>           } catch (Exception ex) {
> >>>               // ignore
> >>>           }
> >>>       }
> >>>
> >>>       private void moveCaretToEnd(){
> >>>           text.setCaretPosition(text.getDocument().getLength());
> >>>       }
> >>>
> >>>       private void processCommand(String cmd) {
> >>>           writeCon("\n");
> >>>
> >>>           DefaultExecutor ex = new DefaultExecutor();
> >>>           CommandLine cmdLine;
> >>>
> >>>           cmdLine = new CommandLine("cmd.exe");
> >>>           cmdLine.addArguments("/E:1900 /C " + cmd);
> >>>
> >>>
> >>>           new Thread(()-> {
> >>>                   JCStream out = new JCStream();
> >>>
> >>>                   PumpStreamHandler streamHandler = new
> >>> PumpStreamHandler(out, out, System.in);
> >>>                   ex.setStreamHandler(streamHandler);
> >>>                   ex.setWorkingDirectory(currentDir);
> >>>                   ex.setExitValues(null);
> >>>                   breakFlag = false;
> >>>
> >>>                   ExecuteWatchdog watchDog = new
> >>> ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT);
> >>>                   ex.setWatchdog(watchDog);
> >>>
> >>>                   new Thread(()->{
> >>>                       while(execProcessRunning){
> >>>                           if(breakFlag){
> >>>                               System.err.println("Break!");   // <<< this
> >>> happens on ctrl + c
> >>>                               watchDog.destroyProcess();      // <<< but
> >>> output to textarea isn't stopped
> >>>                               breakFlag = false;
> >>>                               return;
> >>>                           }
> >>>                           try {
> >>>                               Thread.sleep(50);
> >>>                           } catch (InterruptedException ex1) {
> >>>                               // ignore
> >>>                           }
> >>>                       }
> >>>                   }).start();
> >>>
> >>>                   try {
> >>>                       execProcessRunning = true;
> >>>                       ex.execute(cmdLine);
> >>>                   } catch (IOException ex1) {
> >>>                       // ignore
> >>>                   }
> >>>
> >>>                   execProcessRunning = false;
> >>>                   writeCon("\n");
> >>>               }
> >>>           ).start();
> >>>       }
> >>>
> >>>       public void keyPressed(KeyEvent e) {
> >>>           int keyCode = e.getKeyCode();
> >>>
> >>>           if(e.isControlDown() && keyCode == KeyEvent.VK_C){
> >>>               e.consume();
> >>>               breakFlag = true;
> >>>           }
> >>>       }
> >>>       public void keyTyped(KeyEvent e) {}
> >>>       public void keyReleased(KeyEvent e) {}
> >>>
> >>>       public static void main(String[] args)  {
> >>>           try {
> >>>
> >>> UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
> >>>           } catch(Exception e){
> >>>               // don't care
> >>>           }
> >>>
> >>>           Test t = new Test();
> >>>           t.processCommand("hg log");
> >>>       }
> >>> }
> >>>
> >>>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
> >> For additional commands, e-mail: user-h...@commons.apache.org
> >>
> >>
> >
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
> For additional commands, e-mail: user-h...@commons.apache.org
> 
                                          

Reply via email to