java shell for executing/coordinating processes?

前端 未结 4 454
萌比男神i
萌比男神i 2021-01-14 06:20

I know about using Runtime.exec, you pass it a native program to run + arguments. If it\'s a regular program, you can run it directly. If it\'s a shell script, you have to r

4条回答
  •  北海茫月
    2021-01-14 06:37

    You can use the ProcessBuilder API provided by java.

    Runtime.getRuntime().exec(...) take either an array of strings or a single string. The single-string overloads of exec() will tokenise the string into an array of arguments, before passing the string array onto one of the exec() overloads that takes a string array. The ProcessBuilder constructors, on the other hand, only take a varargs array of strings or a List of strings, where each string in the array or list is assumed to be an individual argument. Either way, the arguments obtained are then joined up into a string that is passed to the OS to execute.

    Find more details at the below link Difference between ProcessBuilder and Runtime.exec()

    Sample program to execute the commands.

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.lang.reflect.Field;
    import java.util.List;
    
    public class ProcessBuilderTest {
        static ProcessBuilder processBuilder = null;
        static Process spawnProcess = null;
        static int exitValue;
        static int pid;
        static List commands;
    
        public static void main(String[] args) {
            runSqoop();
        }
    
        public static void runSqoop() {
            String[] commands = { "ssh", "node", "commands" };
            processBuilder = new ProcessBuilder(commands);
            try {
                System.out.println("Executing " + commands.toString());
                spawnProcess = processBuilder.inheritIO().start();
                try {
                    exitValue = spawnProcess.waitFor();
                    pid = getPID(spawnProcess);
                    System.out.println("The PID is " + pid);
                } catch (InterruptedException e) {
                    System.out.println(e.getMessage());
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
                System.out.println("Process exited with the status :" + exitValue);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static int getPID(Process process) {
            try {
                Class processImplClass = process.getClass();
                Field fpid = processImplClass.getDeclaredField("pid");
                if (!fpid.isAccessible()) {
                    fpid.setAccessible(true);
                }
                return fpid.getInt(process);
            } catch (Exception e) {
                System.out.println(e.getMessage());
                return -1;
            }
        }
    
    }
    

提交回复
热议问题