我写了一个简单的oracle的备份系统,需要调用expdp和impdp命令。结果发现
int exitCode = Runtime.getRuntime().exec(cmd).waitFor(); if(0 == exitCode){ // success }else{ //failure }
这样书写代码之后,晚上执行几千个表的备份的时候,有个数不定的expdp或impdp进程被挂死,不退出。
后来我发现很多人都遇到了类似的问题。解决方法如下:
http://blog.csdn.net/rogerjava/article/details/7006987
http://dhruba.name/2012/10/16/java-pitfall-how-to-prevent-runtime-getruntime-exec-from-hanging/
- public class TESTRuntime {
- public String cmdexeStr = "exp test/test file=d:/daochu.dmp tables=(t_test)";
- public String startRunTime(){
- try {
- Process proc = Runtime.getRuntime().exec(cmdexeStr);
- InputStream errorProcStream = proc.getErrorStream();
- InputStream outputProcStream = proc.getInputStream();
- InputStreamReader errorRead = new InputStreamReader(errorProcStream);
- InputStreamReader outputRead = new InputStreamReader(outputProcStream);
- BufferedReader errorbr = new BufferedReader(errorRead);
- String errorline = null;
- while ((errorline = errorbr.readLine()) != null) {
- System.out.println("------error:/n"+errorline);
- }
- BufferedReader outputbr = new BufferedReader(outputRead);
- String outputline = null;
- while ((outputline = outputbr.readLine()) != null) {
- System.out.println("------debug:/n"+outputline);
- }
- int num = proc.waitFor();
- System.out.println("------num:"+num);
- proc.destroy();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
- }
- public static void main(String[] args) {
- System.out.println("------------start run--------------");
- TESTRuntime test = new TESTRuntime();
- test.startRunTime();
- System.out.println("------------end run--------------");
- }
- }
相关推荐
在Java编程中,`java.lang.Runtime` 类提供了与Java虚拟机的运行时环境交互的方法,其中`Runtime.exec()` 方法尤其受到开发者的青睐,因为它允许Java程序启动和控制外部进程。然而,尽管`Runtime.exec()` 功能强大,...
20. runFinalization():运行挂起 finalization 的所有对象的终止方法。 21. runFinalizersOnExit(value):已过时。 此方法本身具有不安全性。它可能对正在使用的对象调用终结方法,而其他线程正在操作这些对象,...
应妥善处理这些输出,避免程序因未捕获的异常而挂起。 2. **进程管理**:执行的外部进程可能会创建子进程。如果需要确保所有相关进程都被结束,可能需要使用更复杂的逻辑来跟踪和终止它们。 3. **权限问题**:终止...
- 检查是否有线程被意外地挂起或等待。 - **1.3.6 多个锁导致的锁链分析** - 分析线程堆栈中的锁信息,找出可能存在的锁链顺序问题。 - 调整代码逻辑,尽可能减少锁的竞争。 - **1.3.7 通过线程堆栈进行性能瓶颈...
在标题和描述中提到的问题是关于如何正确地使用`Runtime.getRuntime().exec()`方法来避免内存占用过大或导致程序挂起的情况。这个问题的核心在于理解和处理子进程的输入、输出和错误流。 首先,我们来看一下原始的`...
如果要执行关机命令,可以将"reboot"替换为"shutdown -h now",这里的"-h"表示挂起,"now"表示立即执行。 2. **使用ProcessBuilder类执行命令** ```java ProcessBuilder pb = new ProcessBuilder("su", "-c", ...
- 在Java中,可以使用Runtime类的exec方法执行系统命令,或者使用java.lang.ProcessBuilder和java.lang.Process类来控制进程。 - Python中,可以使用os模块的os.kill()或subprocess模块来结束进程。 4. **安全与...
它首先同步所有挂起的操作,然后根据传入的原因选择合适的重启模式。 4. **注意事项**: - 使用API接口重启时,需要注意不同版本的Android系统可能存在差异,因此在实际开发中应考虑兼容性问题。 - 调用API接口...