【问题标题】:Executing shell scripts from a Java application independently从 Java 应用程序独立执行 shell 脚本
【发布时间】:2009-05-14 19:40:45
【问题描述】:

我有一个 java 应用程序,它由一个线程组成,它监视数据库中的一个表,该表包含要执行的 shell 脚本。我每隔几秒钟就查一下数据库。对于脚本,执行它(通过 Process 类),然后等待表中的另一个脚本。

我的问题是:有时,脚本中的某些命令会失败。该线程捕获错误流并将其记录在数据库中。但是,它会不断记录消息,并且控件不会从脚本返回到 Java 线程,因此数据库中的后续 shell 脚本无法执行。

有解决办法吗?

【问题讨论】:

  • 有没有办法检测错误情况并调用 process.destroy()?

标签: java shell


【解决方案1】:

您是否在阅读 both 标准输出 标准错误?您是在单独的线程中执行此操作吗?根据您使用脚本输出的方式,可能会阻止其中一个,我有一种预感,您的脚本被阻止等待父进程使用其输出。

来自Process 文档:

由于部分原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能导致子进程阻塞,甚至死锁

请参阅this question 和引用“stream gobblers”的示例代码。 2 'gobbler's 被创建,消耗标准输出和标准错误。

【讨论】:

  • 我正在读取同一个线程中的两个流,并记录它。只是想在错误发生后找到摆脱阻塞模式的方法,而不是继续打印出来。
  • 您将必须在单独的线程上读取,以继续使用输出/错误流并防止 exec() 阻塞。我怀疑当您遇到错误时,其中一个流会阻塞,因为它没有被消耗(stderr?),因此您会阻塞。
猜你喜欢
  • 1970-01-01
  • 2011-05-21
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2012-07-05
  • 2019-11-22
相关资源
最近更新 更多