/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package webcamstudio.media.renderer; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Writer; import java.lang.reflect.Field; import java.util.logging.Level; import java.util.logging.Logger; import webcamstudio.externals.ProcessRenderer; import webcamstudio.util.Tools; /** * * @author patrick (modified by karl) */ public class ProcessExecutor { private static String childPids = ""; private static final String userHomeDir = Tools.getUserHome(); private static final Runtime rt = Runtime.getRuntime(); public static int getUnixPID(Process process) throws Exception //Author Martijn Courteaux Code { // System.out.println("Process_GetUnixPid: "+process.getClass().getName()); String pName = process.getClass().getName(); if (pName.equals("java.lang.UNIXProcess")) { Class cl = process.getClass(); Field field = cl.getDeclaredField("pid"); field.setAccessible(true); Object pidObject = field.get(process); return (Integer) pidObject; } else { throw new IllegalArgumentException("Needs to be a UNIXProcess"); } } public static void killUnixProcess(Process process) throws Exception //Modified from Martijn Courteaux Code { int pid = getUnixPID(process); // System.out.println("Process_Pid: "+pid); String commandPids = "ps -ef | awk '{if ($3 == "+pid+") print $2;}'"; File fileP=new File(userHomeDir+"/.webcamstudio/"+"WSBust.sh"); FileOutputStream fosV; Writer dosV = null; try { fosV = new FileOutputStream(fileP); dosV= new OutputStreamWriter(fosV); } catch (FileNotFoundException ex) { Logger.getLogger(ProcessRenderer.class.getName()).log(Level.SEVERE, null, ex); } try { dosV.write("#!/bin/bash\n"); dosV.write(commandPids+"\n"); dosV.close(); } catch (IOException ex) { Logger.getLogger(ProcessRenderer.class.getName()).log(Level.SEVERE, null, ex); } String batchPidCommand = userHomeDir+"/.webcamstudio/"+"WSBust.sh"; fileP.setExecutable(true); Tools.sleep(10); try { Process getChildPids = rt.exec(batchPidCommand); Tools.sleep(10); getChildPids.waitFor(); //Author spoonybard896 BufferedReader buf = new BufferedReader(new InputStreamReader( getChildPids.getInputStream())); String line = ""; childPids = ""; while ((line = buf.readLine()) != null) { childPids += line + "\n"; } //Author spoonybard896 } catch (IOException | InterruptedException e) { e.printStackTrace(); } rt.exec("kill " + pid).waitFor(); // andrew.silver0 mod from -9 rt.exec("kill " + childPids).waitFor(); //andrew.silver0 mod from -9 // System.out.println("ChildPid: "+childPids); childPids = null; } private Process process; private boolean processRunning = false; private String name = ""; public ProcessExecutor(String gName) { this.name = gName; } private void readOutput(final Process p){ new Thread(new Runnable() { @Override public void run() { InputStream in1 = p.getErrorStream(); InputStream in2 = p.getInputStream(); byte[] buffer = new byte[65536]; int count = 0; while (count != -1 && processRunning){ try { count = in1.read(buffer); if (count > 0){ System.out.println("Process Err: " + new String(buffer,0,count)); } // count = in2.read(buffer); // if (count > 0){ // System.out.println("FFMPEG Out: " + new String(buffer,0,count)); // } Tools.sleep(100); } catch (IOException ex) { Logger.getLogger(ProcessExecutor.class.getName()).log(Level.SEVERE, null, ex); break; } } System.out.println("Process Closing streams"); } }).start(); } public void execute(String[] params) throws IOException, InterruptedException { process = rt.exec(params); processRunning = true; // readOutput(process); } // Testing console capture public Process executeC(String[] params) throws IOException, InterruptedException { process = rt.exec(params); processRunning = true; return process; // readOutput(process); } public void executeString(String params) throws IOException, InterruptedException { process = rt.exec(params); // System.out.println("Process: "+process); processRunning = true; // readOutput(process); } public void destroy() { processRunning=false; try { // if (process != null){ killUnixProcess(process); // process = null; // } } catch (Exception ex) { Logger.getLogger(ProcessExecutor.class.getName()).log(Level.SEVERE, null, ex); } } public String getProcessPID(){ try { if (process != null){ int parentPID = getUnixPID(process); String commandPids = "ps -ef | awk '{if ($3 == "+parentPID+") print $2;}'"; File fileP=new File(userHomeDir+"/.webcamstudio/"+"WSBust.sh"); FileOutputStream fosV; Writer dosV = null; try { fosV = new FileOutputStream(fileP); dosV= new OutputStreamWriter(fosV); } catch (FileNotFoundException ex) { Logger.getLogger(ProcessRenderer.class.getName()).log(Level.SEVERE, null, ex); } try { dosV.write("#!/bin/bash\n"); dosV.write(commandPids+"\n"); dosV.close(); } catch (IOException ex) { Logger.getLogger(ProcessRenderer.class.getName()).log(Level.SEVERE, null, ex); } fileP.setExecutable(true); String batchPidCommand = userHomeDir+"/.webcamstudio/"+"WSBust.sh"; try { Process getChildPids = rt.exec(batchPidCommand); getChildPids.waitFor(); //Author spoonybard896 BufferedReader buf = new BufferedReader(new InputStreamReader( getChildPids.getInputStream())); String line = ""; childPids = ""; while ((line = buf.readLine()) != null) { childPids += line + "\n"; } //Author spoonybard896 } catch (IOException | InterruptedException e) { e.printStackTrace(); } } } catch (Exception ex) { Logger.getLogger(ProcessExecutor.class.getName()).log(Level.SEVERE, null, ex); } return childPids; } }