`

runtime.exec()执行进程block死锁问题

阅读更多

最近在java代码中使用runtime.exec执行rsync命令做同步,发现当两个目录需要非常大同步工作的时候,rsync进程就会一直阻塞。查看了jdk帮助,以及google都无果,于是打算把执行的信息都log出来,结果执行突然成功。仔细思考,这个问题应该是进程执行命令的时候,输出结果有个buffer,如果buffer已经满了,而没有进程去读,这个进程就会阻塞等待,导致我前面的问题出现。

效果可以通过如下代码说明:

import java.io.*;

public class Rsync{
	public static void main(String[] args) throws Exception{
		if(args.length != 2){
			System.out.println("Usage: java Rsync src des");
			return;
		}
		Process proc = Runtime.getRuntime().exec("rsync -v -r -e --progress ssh -t -C " + args[0] + " " + args[1]);
		System.out.println("Waiting for end...");
		BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
		String line = null;
		while((line = br.readLine()) != null){
			System.out.println(line);
		}
		br.close();
                int exitValue = 0;
		if((exitValue = proc.waitFor()) != 0){
			System.out.println("exitValue:" + exitValue);
		}
		System.out.println("rsync complete!");
	}
}
 

如果注释掉:

      BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
		String line = null;
		while((line = br.readLine()) != null){
			System.out.println(line);
		}
		br.close();

 在两个目录需要大量的同步操作时就会一直blocked住。

所以如果你不需要执行命令的输出,最好直接将输出重定向到 > /dev/nll

 

0
0
分享到:
评论
2 楼 D04540214 2010-05-29  
Process proc = Runtime.getRuntime().exec("rsync -v -r -e --progress ssh -t -C " + args[0] + " " + args[1]); 越来越发现这段代码的用处
1 楼 felixzz 2010-01-27  
你不想要输出还加-v干吗

相关推荐

    解决runtime.exec()执行进程block死锁以及为waitFor设置超时

    完美解决runtime.exec()执行进程block死锁以及为waitFor设置超时 不需要耗cpu的循环判断exitValue==0 开两个进程搞定

    进程线程及死锁

    进程是操作系统中一个独立的执行单元,它拥有自己的虚拟地址空间和系统资源。线程是轻量级的进程,它共享同一个进程的虚拟地址空间和系统资源。理解进程和线程的概念对于操作系统的设计和实现至关重要。 在POSIX...

    用C语言实现死锁检测.rar_c语言判断死锁_deadlock_死锁_死锁 检测_死锁c语言

    在计算机系统中,死锁是一个严重的问题,它发生在多个进程互相等待对方释放资源而无法继续执行的情况。在C语言中实现死锁检测是一项技术性的挑战,因为这涉及到操作系统原理和多线程编程。本文将深入探讨如何使用...

    关于进程中死锁问题的研究.pdf

    关于进程中死锁问题的研究 本文研究的是操作系统进程中的死锁问题,旨在解决计算机科学中一个基本问题,即并行程序的终止性问题。死锁问题是一种普遍现象,不仅在计算机系统中,在日常生活中也是屡见不鲜的。掌握对...

    深入研究java.lang.Runtime类.doc

    3. exec(String command):在单独的进程中执行指定的字符串命令。 4. exec(String[] cmdarray):在单独的进程中执行指定命令和变量。 5. exec(String[] cmdarray, String[] envp):在指定环境的独立进程中执行指定...

    操作系统银行家算法避免进程死锁问题

    安全性算法,银行家算法,避免进程死锁的问题,这是我用C语言编的程序,运行通过。

    BA.rar_ba_死锁_银行家算法_银行家算法实验报告

    在多任务并发执行的环境中,死锁问题是一个常见的挑战,它发生在多个进程之间相互等待对方释放资源,导致系统停滞不前。为了解决这个问题,学术界提出了多种死锁预防和避免策略,其中银行家算法是较为著名的一种。 ...

    循环等待 死锁状态.rar_循环列表死锁

    在计算机系统中,死锁是一个严重的问题,尤其是在多线程和并发编程中。"循环等待 死锁状态"这个主题涉及到的是线程间资源的互相依赖,导致它们都无法继续执行的状态。这种现象通常发生在多个线程各自持有某些资源并...

    典型死锁问题.rar_操作系统典型死锁问题

    操作系统中的死锁问题一直是计算机科学领域的一个重要话题,特别是在多任务并发执行的环境中。这个问题涉及到资源分配、进程调度以及系统安全。本压缩包文件“典型死锁问题.rar”提供了三个经典的死锁示例:哲学家...

    银行家算法的思想,编写程序,解决并发进程的死锁问题。

    根据银行家算法的思想,编写程序,解决并发进程的死锁问题。 本实验要求设计并实现银行家算法。银行家算法是死锁避免的经典算法,其核心思想是:进程动态地申请资源,每次申请资源时系统都执行安全状态检查算法判断...

    3.1 并发进程的同步、互斥与死锁(1).1 并发进程的同步、互斥与死锁.pptx

    综上所述,本章节详细探讨了并发进程中的关键概念和技术,包括并发性的基本原理、进程间的协作与竞争、临界区管理、信号量与PV操作、管程以及进程通信和死锁问题。这些内容对于深入理解现代操作系统的设计原理和实现...

    操作系统实验三 预防进程死锁的银行家算法

    在多任务并发运行的环境中,死锁是一个严重的问题,它指的是两个或多个进程互相等待对方释放资源而无法继续执行的情况。银行家算法是一种预防进程死锁的经典策略,由艾兹格·迪杰斯特拉提出,主要用于确保系统的安全...

    SQL Server死锁的解除方法

    2. 使用exec master..xp_lockinfo 1, 0命令来查询死锁的进程信息,并杀掉死锁的进程。 3. 使用exec master..xp_lockinfo 2, 0命令来查询死锁的进程信息,并显示死锁的进程的详细信息。 SQL Server死锁的解除方法也...

    sql数据库死锁查询工具

    在SQL数据库管理中,死锁和阻塞是常见的问题,特别是在多用户环境下,它们可能导致系统性能下降甚至数据丢失。理解并有效地处理这些问题至关重要。本文将深入探讨“sql数据库死锁查询工具”及其在解决数据库死锁和...

    操作系统实验六 死锁问题实验

    死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们都将无法推进下去。这个实验的目标是让学生深入理解死锁的产生,以及学习如何解决死锁问题。 实验报告中提到了使用...

    进程死锁查看器

    死锁是多线程编程中一个严重的问题,当两个或多个进程互相等待对方释放资源而无法继续执行时,就形成了死锁。这个工具对于开发者和系统管理员来说非常有价值,因为它可以帮助他们定位并解决可能导致系统性能下降或...

    第2次作业1

    1. **死锁的基本概念**:死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们都将无法推进下去。 2. **死锁的四个必要条件**:互斥条件、占有且等待条件、不可抢占条件和...

    关于过大的占用内存的方法1

    总结来说,使用`Runtime.exec()`执行外部命令时,必须注意处理子进程的输入、输出和错误流,以防止内存占用过大或程序挂起。这通常意味着需要创建`InputStreamReader`和`BufferedReader`来读取输出流,并确保及时...

    SQLServler自动杀死死锁进程

    在SQL Server数据库管理系统中,死锁是常见的并发问题,它发生在两个或多个事务相互等待对方释放资源,导致它们都无法继续执行。"SQLServer自动杀死死锁进程"这一话题旨在探讨如何配置SQL Server来自动检测并解决...

Global site tag (gtag.js) - Google Analytics