文档章节

为Process.waitFor设置超时

heeee
 heeee
发布于 2014/08/18 16:34
字数 340
阅读 3912
收藏 2

Java中在使用Runtime.getRuntime().exec(command)调用系统命令后
一般会调用Process.waitFor()来等待命令执行结束 获取执行结果
今天一个悲剧的事实证明了
即使只是调用了很简单的脚本命令
在调用Process.waitFor()后同样可能发生无休止或者接近于无休止的阻塞
处理完故障之后痛定思痛
决定在代码中加入超时控制
但是Process.waitFor()本身并不支持超时时间设置
一个方法是改用非阻塞的Process.exitValue()方法
然后轮询检查进程状态 这种方式比较消耗CPU
以至于轮询间隔也不能设置得太小 总归不是很完美
另外就是多起一个线程
借助于其他的超时机制来控制
最后使用的代码如下


public class ProcessUtils {
    
    /**
     * 运行一个外部命令,返回状态.若超过指定的超时时间,抛出TimeoutException
     * @param command
     * @param timeout
     * @return
     * @throws IOException
     * @throws InterruptedException
     * @throws TimeoutException
     */
    public static int executeCommand(final String command, final long timeout) throws IOException, InterruptedException, TimeoutException {
        Process process = Runtime.getRuntime().exec(command);
        Worker worker = new Worker(process);
        worker.start();
        try {
            worker.join(timeout);
            if (worker.exit != null){
                return worker.exit;
            } else{
                throw new TimeoutException();
            }
        } catch (InterruptedException ex) {
            worker.interrupt();
            Thread.currentThread().interrupt();
            throw ex;
        } finally {
            process.destroy();
        }
    }
    
 
    private static class Worker extends Thread {
        private final Process process;
        private Integer exit;
 
        private Worker(Process process) {
            this.process = process;
        }
 
        public void run() {
            try {
                exit = process.waitFor();
            } catch (InterruptedException ignore) {
                return;
            }
        }
    }
 
}



本文转载自:http://www.yumao.name/?p=1154

heeee
粉丝 9
博文 22
码字总数 4743
作品 0
深圳
高级程序员
私信 提问
[Android]ping -c 1 -w 100 sina.cn的解析

Android 环境下:ping -c 1 -w 100 sina.cn -c: 表示次数,1 为1次-w: 表示deadline, time out的时间,单位为秒,100为100秒。 连起来的意思是,ping 主机sina.cn 一次,超时为100秒。要命的...

清水湾2012
2014/01/03
4.8K
0
java里执行linux命令,关于死锁的问题

最近在用Java调用ffmpeg的命令,所以记录下踩到的坑 如果要在Java中调用shell脚本时,可以使用Runtime.exec或ProcessBuilder.start。它们都会返回一个Process对象,通过这个Process可以对获取...

TonyStarkSir
2018/07/28
109
0
Java里执行linux命令,关于死锁的问题

最近在用ffmpeg,所以经常会调用ffmpeg的一些命令,记录一下遇到的坑 如果要在Java中调用shell脚本时,可以使用Runtime.exec或ProcessBuilder.start。它们都会返回一个Process对象,通过这个...

TonyStarkSir
2018/07/28
0
0
Process.waitFor()返回值为1

linux下在程序中调用, Process process = Runtime.getRuntime().exec(cmdRun,null,file); 直接在命令行中运行代码没问题,但放到服务器的程序中,process.waitfor返回值为1...

zyzn123
2016/09/18
437
0
android获取root权限好像失败了,求解

process = Runtime.getRuntime().exec("su"); process.waitFor(); 返回值为1 好像是权限不足的意思。。。

穷土包
2013/06/26
212
1

没有更多内容

加载失败,请刷新页面

加载更多

springboot 403 问题

添加WebAppConfigurer 配置 @Configuration@EnableAutoConfigurationpublic class WebAppConfigurer extends WebMvcConfigurerAdapter { public WebAppConfigurer() { } ......

布袋和尚_爱吃鱼
21分钟前
3
0
Python自动更换壁纸爬虫与tkinter结合

直接上代码 import ctypesimport timeimport requestsimport osfrom threading import Threadfrom tkinter import Tk, Label, Button,Entry,StringVar,messagebox# '放到AppData\Roami......

物种起源-达尔文
22分钟前
3
0
Postgresql Study 笔记

Postgresql 安装 Windows, MAC Install Postgresql 下载地址: https://www.enterprisedb.com/downloads/postgres-postgresql-downloads Linux Install sudo apt-get update sudo apt-get in......

slagga
24分钟前
3
0
layer.open 打开新页面传参问题

如图所示,点击出售,把A页面的数据传到弹框上面,因为弹框比较复杂,所以使用引入一个新页面。 A.html a.js B.html b.js 1、第一种方案 sellInte: function (){ var obj = document.g...

木九天
27分钟前
4
0
沙龙报名 | 区块链数据服务技术应用实践

京东云是国内首家提供区块链数据在线分析服务产品的公司,也是行业内首家对区块链数据服务进行开源的公司。 本次沙龙是京东云BDS开源后,首次在深圳举办线下沙龙,我们将邀请京东云BDS团队核...

京东云技术新知
27分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部