【问题标题】:Calling cat from a shell which is in turn called by java exec从 shell 调用 cat,而 shell 又由 java exec 调用
【发布时间】:2012-08-13 11:30:46
【问题描述】:

我有一个 shell 脚本 test.sh:

cat /home/tomcat/temp/tempLogFile.log > /home/tomcat/temp/logFile_test.log

我通过 Runtime.getRuntime().exec("test.sh") 从 java 调用 test.sh

它创建 logFile_test.log 但没有写入任何内容。

如果我直接从 shell 运行脚本,它可以正常工作。 可能出了什么问题?

谢谢,

更新:有趣的是,如果我这样做,效果很好

echo 'cat /home/tomcat/temp/tempLogFile.log > /home/tomcat/temp/logFile_test.log' | at now

但我不能使用at now,因为我需要等待 cat 完成

【问题讨论】:

  • 可能加 2>&1 并在文件中查看 cat 是否打印错误信息
  • 我尝试了 2>&1 但仍然没有。没有错误。甚至 Runtime.getRuntime().exec("test.sh") 的进程退出状态也是 0

标签: java shell exec


【解决方案1】:

也许你的命令路径搞砸了?该命令将创建 logFile_test.log,即使它无法运行 cat 程序。尝试添加类似:

set > /tmp/dump.txt

到 shell 脚本。这会将进程的环境变量的副本写入/tmp/dump.txt。检查这些可能会帮助您找出问题所在。

另一种可能是磁盘已满。在这种情况下,您可以创建空文件,但不能向其中写入任何数据。

【讨论】:

  • 我试过了。 set > /tmp/dump.txt 将内容转储到文件中。但只是那只猫在文件中并使用重定向转储其内容是行不通的
【解决方案2】:

一旦你调用getRuntime().exec("ANY_COMMAND");,它会返回一个进程实例,使用进程对象你可以获得输入和输出流,然后将任何其他命令传递给同一个进程或读取输出,为此你有三个流连接

  1. 输出流:- 让您控制向同一进程发送更多参数或命令
  2. 输入流:- 让您控制从进程的标准输出中读取值
  3. 错误流:- 为您提供在执行任何命令期间发生的所有错误。

即使你有任何错误,你也可以检查错误流,看看哪里出了问题。

您可以参考Java process.getInputStream() has nothing to read, deadlocks child

【讨论】:

  • 是的,我尝试从错误流中获取输出,但其中没有任何内容。甚至进程的退出状态也返回 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 2013-09-02
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
相关资源
最近更新 更多