我知道这绝对是黑暗中的一击,但我们绝对感到困惑。

Java(1.5)运行的perl(5.8.6)脚本需要一个多小时才能完成。从命令行手动运行相同的脚本需要12分钟才能完成。这是在Linux主机上。

两种情况下的日志记录都相同,并且两种情况下的脚本都使用相同的参数运行。

该脚本执行一些复杂的工作,例如Oracle DB访问,某些scp等,但是同样,在两种情况下,它执行的操作完全相同。

我们很沮丧。有没有人遇到过类似情况?如果不是这样,并且遇到相同的情况,您将如何考虑对其进行调试?

最佳答案

如果未刷新其stdout / stderror流,则产生控制台输出的子过程可能会阻塞(并导致死锁)。 @gustafc,当它尝试写入stdout / stderror时,所构成的代码最终将阻止子进程,并且流中没有空间(并且Java也未为该流提供服务)。

Process p = startProcess();

final InputStream stdout = p.getInputStream();
final InputStream sterr = p.getErrorStream();

new Thread() {
 public void run() {
  int c;
  while ((c = sterr.read()) != -1) {
   System.out.print((char)c);
  }
 }
}.start();

new Thread() {
 public void run() {
  int c;
  while ((c = sterr.read()) != -1) {
   System.out.print((char)c);
  }
 }
}.start();

关于java - 从Java启动的Perl永远存在,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2950546/

10-11 19:38
查看更多