Java执行命令获取结果并超时退出

本文介绍了一种使用Java实现的命令执行方法,包括如何通过Java Runtime API执行命令,并在指定时间内检查命令是否完成,如果命令执行超时,则会中断执行并返回错误信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做个功能,要用java执行命令,需要获取结果,同时也要求命令执行只能在一个固定的时间内结束,否则就应该超时退出。我想这个功能网上应该一大把吧,没必要自已写,就随便搜了一下,找到一个csdn的,下载还要三分。三分就三分吧,下来一看,居然是再起一个线程去监视执行线程。靠,浪费老子三分。干脆自已看了看api,自已搞。以下是我的实现,有需要的同学可以参考:

/**
 * 命令执行
 * @param cmd
 * @param envs
 * @param timeout
 * @return
 */
private String execCMD(String cmd, String[] envs, int timeout) {
	Process process = null;
	StringBuilder sbStd = new StringBuilder();
	StringBuilder sbErr = new StringBuilder();
	
	long start = System.currentTimeMillis() / 1000;
	try {
		if (envs == null) {
			process = Runtime.getRuntime().exec(cmd);
		} else {
			process = Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", cmd }, envs);
		}

		BufferedReader brStd = new BufferedReader(new InputStreamReader(process.getInputStream()));
		BufferedReader brErr = new BufferedReader(new InputStreamReader(process.getErrorStream()));
		String line = null;

		while (true) {
			if (brStd.ready()) {
				line = brStd.readLine();
				sbStd.append(line + "\n");
				continue;
			} 
			if (brErr.ready()) {
				line = brErr.readLine();
				sbErr.append(line + "\n");
				continue;
			} 
			
			if (process != null) {
				try {   
                    process.exitValue();   
                    break;
                } catch (IllegalThreadStateException e) {   
                }   
			}
			
			if (System.currentTimeMillis() / 1000 - start > timeout) {
				sbErr.append("\n命令执行超时退出.");
				break;
			}
			
			try {
				TimeUnit.MILLISECONDS.sleep(500);
			} catch (InterruptedException e) {
			}
		}
	} catch (IOException e) {
	} finally {
		if (process != null) {
			process.destroy();
		}
	}
	
	if (sbErr.length()>0) {
		return sbErr.toString();
	} else {
		return sbStd.toString();
	}
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值