clojure.java.shell/launch 不清除输出,这会导致进程挂起。以下是一个 curl 下载并打印 1MB 文本的示例
$ clj
Clojure 1.11.0-alpha4
user=> (require '[clojure.java.shell :refer [launch]])
nil
user=> (launch "curl" "https://gist.githubusercontent.com/khaykov/a6105154becce4c0530da38e723c2330/raw/41ab415ac41c93a198f7da5b47d604956157c5c3/gistfile1.txt")
我认为一个解决方案是将 clojure.java.shell 从 (.exit (Runtime/getRuntime))
移动到这个特定功能,并使用 java.lang.ProcessBuilder
代替,它有一个可以丢弃输出的选项。
https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/lang/ProcessBuilder.Redirect.html#DISCARD
注意:DISCARD 仅在 Java 9 及更高版本中可用。我们可以在顶级 try/catch 中尝试解决 DISCARD 是否可用,然后使用它(如果可用),如果不可用则回退到 PIPE。其他选择包括使用线程在进程运行时消耗输出,或将输出重定向到临时文件。
如果需要,我将提供补丁,并在解决方案方向达成一致后提供。