Java调用shell脚本阻塞
2016-12-29 18:14
369 查看
Java在调用Shell时,要不断读取进程中标准输出和错误输出流的信息,否则缓冲区被写满就会造成子进程阻塞而无法继续运行下去,可起两个线程不断读取标准输出、错误流信息而不被阻塞,如下代码所示
其中execLocal 为本地调用cmd的方法
exeRemote 可利用ssh登录远程机器调用cmd的方法
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import org.apache.commons.io.IOUtils; import ch.ethz.ssh2.ChannelCondition; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; public class RmtShellExecutor { private Connection conn; private String ip; private String usr; private String psword; private String charset = Charset.defaultCharset().toString(); private static final int TIME_OUT = 1000 * 5 * 60; public RmtShellExecutor(String ip, String usr, String ps) { this.ip = ip; this.usr = usr; this.psword = ps; } private boolean login() throws IOException { conn = new Connection(ip); conn.connect(); return conn.authenticateWithPassword(usr, psword); } //本地执行方法 public static void execLocal(String cmd) { try { Process proc = Runtime.getRuntime().exec(cmd); StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR"); StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT"); errorGobbler.start(); outputGobbler.start(); int exitVal = proc.waitFor(); System.out.println("ExitValue: " + exitVal); } catch (Exception e) { e.printStackTrace(); } } //远程执行方法 public int execRemote(String cmds){ InputStream stdOut = null; InputStream stdErr = null; int ret = -1; try { if (login()) { // Open a new {@link Session} on this connection Session session = conn.openSession(); // Execute a command on the remote machine. session.execCommand(cmds); GobblerThread gtOut = new GobblerThread(session.getStdout(),"STD_OUT"); GobblerThread gtErr = new GobblerThread(session.getStderr(),"STD_ERR"); gtOut.start(); gtErr.start(); session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT); ret = session.getExitStatus(); } else { } }catch(Exception e){ e.printStackTrace(); } finally { if (conn != null) { conn.close(); } IOUtils.closeQuietly(stdOut); IOUtils.closeQuietly(stdErr); } return ret; } public static void main(String args[]) throws Exception { RmtShellExecutor exe = new RmtShellExecutor("192.168.3.5", "test", "123456"); System.out.println(exe.execRemote("sh /home/test/cmd.sh company=32")); } } class GobblerThread extends Thread { InputStream is; String type; GobblerThread(InputStream is, String type) { this.is = is; this.type = type; } public void run() { try { InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line=null; while ( (line = br.readLine()) != null) System.out.println(line); } catch (IOException e) { e.printStackTrace(); } } }
其中execLocal 为本地调用cmd的方法
exeRemote 可利用ssh登录远程机器调用cmd的方法
相关文章推荐
- java 调用bash shell脚本阻塞的小问题的解决
- Java调用 shell脚本阻塞
- Java 调用Shell脚本
- java调用shell脚本,并获得结果集
- 使用bat命令或shell脚本调用java程序
- java调用linux脚本 shell
- java调用shell脚本
- Java调用远程Shell脚本(待验证)
- java jsp调用shell(带参数)脚本并返回值
- JAVA调用shell脚本实例
- JAVA调用Shell脚本
- Linux中,shell脚本调用java程序模板
- java调用shell脚本,并获得结果集的例子
- java调用Shell脚本
- java调用Shell脚本
- Java调用shell脚本
- 在java程序中如何调用linux的命令?如何调用shell脚本呢?
- Java调用shell脚本遭遇的问题以及解决办法
- java 远程调用shell脚本demo
- Java调用远程Shell脚本