Java如何调用script

在Java 中如何调用各种脚本(shell,perl,python...)? 我们肯定会想到使用 Runtime.getRuntime().exec(cmd). 不过实际中根据需求会有更多更复杂的处理。 当有很多的脚本需要任务调度, 现在粗略给出一种解决办法 。
1. 开启一个服务端(单独的线程)专门来接受脚本

public class ScriptRunnerService {
    private static int port = 4444;
    public static void main(String[] args) {
        ScriptRunnerService srs = new ScriptRunnerService();
        String hostIp = args[0];
        String hostPort =  args[1];
        srs.go(hostIp, hostPort);
    }

    public void go(String hostIp, String hostPort) {
        try {
            ServerSocket listener = new ServerSocket(Integer.valueOf(hostPort), 0, InetAddress.getByName(hostIp));
            Socket clientSocket;
            while (true) {
                clientSocket = listener.accept();
                Thread t = new Thread(new ServiceRunner(clientSocket));
                t.start();
            }
        } catch (IOException ioe) {
            System.out.println("IOException on socket listen: " + ioe);
        } finally {
        }
    }
    class ServiceRunner implements Runnable {
        private Socket clientSocket;
        ServiceRunner(Socket clientSocket) {
            this.clientSocket = clientSocket;
        }
        @Override
        public void run() {
            int result = 1;
            String line;
            StringBuilder command = new StringBuilder();
            BufferedReader br = null;
            BufferedWriter bw = null;
            try {
                System.out.print("command receiving...");
                br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                if ((line = br.readLine()) != null) {
                    command.append(line);
                }
                bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
                System.out.println(command);
                Process p = Runtime.getRuntime().exec(command.toString());
                result = p.waitFor();
               p.destroy();
                write(bw, command.toString() + "\r\n");
            } catch (InterruptedException ie) {
                write(bw, ie.getMessage() + "\r\n");
            } catch (IOException ioe) {
                write(bw, ioe.getMessage() + "\r\n");
            } finally {
                write(bw, "..Result.." + result + "\r\n");
                write(bw, "..Command.." + command.toString() + "\r\n");
                write(bw, "Host...." + clientSocket.getInetAddress().getHostAddress() + "\r\n");
                try {
                    clientSocket.close();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
                System.out.println("\t\tcommand finished with result: " + result);
            }
        }
    }
    private void write(BufferedWriter bw, String msg) {
        try {
            bw.write(msg);
            bw.flush();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

 

 public class AppInitializer{
   public void  execScriptService(){
   	String[] envParams = {"java -cp";, completeClasspath,   ScriptRunnerService.class.getName(),“127.0.0.1”,“4445”};
    	ScriptRunnerService       scriptRunnerProcess = Runtime.getRuntime().exec(envParams);
}
 

 

2. 客户端专门接受服务端的返回消息

 

public class SocketTransport {
    protected Logger log = new Logger(SocketTransport.class.getName());
    public String query(String host, int port, String queryString) throws IOException {
        String line;
        BufferedReader rd = null;
        BufferedWriter wr = null;
        Socket serverSocket = null;
        StringBuilder response = new StringBuilder();
        try {
            serverSocket = new Socket(InetAddress.getByName(host), port);
            wr = new BufferedWriter(new OutputStreamWriter(serverSocket.getOutputStream(), "UTF8"));
            log.warn("sending request: %s to %s:%s ", queryString, host, port);
            wr.write(queryString + "\r\n");
            wr.flush();
            rd = new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
            while ((line = rd.readLine()) != null) {
                response.append(line);
            }
        } catch (UnknownHostException e) {
            log.error(e);
            throw new IOException(e);
        } finally {
            IOUtils.closeQuietly(wr);
            IOUtils.closeQuietly(rd);
            if (serverSocket != null) {
                serverSocket.close();
            }
        }
        log.warn("finish request: ", queryString);
        return response.toString();
    }
}

 

3.  执行脚本

 

public class ScriptTest {
    public static void execute(String path , String script, String param) throws IOException, InterruptedException{
       if(...){

        SocketTransport st = new SocketTransport();
        String msg = st.query("127.0.0.1", 4445, "java -version");
        System.out.println(msg);
     else{

          Process p = Runtime.getRuntime().exec(path + script + params);
            System.out.println("Executing for "+type+": " + path + script + params);
            p.waitFor();
            p.destroy();
          }        
    }
    
}
 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值