java - 从终端执行linux命令和java运行时进程的区别

标签 java shell

我正在寻找一种方法来编写由java应用程序通过脚本执行的python运行日志。

假设我的脚本是:

import time

for x in range(120):
  print("Running ", x)
  time.sleep(1)

这是我当前的解决方案:

  1. 使用java触发脚本
String cmd = "python script.py";
var process = Runtime.getRuntime().exec(cmd, null, new File(sandboxPath));
  • 将日志写入新文件:
  • String traceLogCmd = String.format("strace -p %s -s 9999 -e trace=write -o output.txt", process.pid());
    Runtime.getRuntime().exec(traceLogCmd, null, new File(sandboxPath));
    

    现在的问题是 output.txt 只有在 python 脚本执行完成时才包含内容,因此我无法 tailf 输出文件。

    同时,如果我直接从终端执行 python script.pystrace 命令,输出正是我所期望的。

    如果我做错了什么,有人可以纠正我,或者有其他方法来获取 python 日志吗?

    提前致谢。

    最佳答案

    使用ProcessBuilder而不是Runtime.exec()。更多详情:When Runtime.exec() won't

    以下代码将附加到脚本 sb.append(line);StringBuilder 对象输出。将该内容写入文件并不困难。

    Process p = new ProcessBuilder("sh", "-c", "python", "path-to-your-script").start();
    String result = getCommandResult(p.getInputStream());
    
    private static String getCommandResult(InputStream stream) throws IOException {
    
        StringBuilder sb = new StringBuilder();
        try (InputStreamReader isr = new InputStreamReader(stream);
             BufferedReader in = new BufferedReader(isr)) {
    
            String line;
            while ((line = in.readLine()) != null) {
                sb.append(line);
            }
        }
        return sb.toString().trim();
    }
    

    关于java - 从终端执行linux命令和java运行时进程的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58203168/

    相关文章:

    java - CMD中的Android备份提取错误

    java - session 超时的工作方式与我希望的不同

    ios - 是否可以使用 Xcode 构建脚本将 JSON 文件下载到应用程序包中?

    php - shell whoami 不等于 php shell_exec whoami?

    java - 如何以编程方式关闭三星设备上的电容式按钮灯?

    java - 这个私有(private)变量如何访问?

    java - 验证日期 - Bean 验证注释 - 具有特定格式

    linux - 如何使用 shell 脚本查找具有最大上下文长度的行号?

    bash - 合并 CSV 文件 : Appending instead of merging

    bash - 将 shell 脚本设置为 utf8