在 Clojure 中,如何向 Clojure.java.shell/sh 创建的进程发送退出命令

Col*_*ell 6 shell clojure pocketsphinx

我正在尝试从 clojure 运行pocketsphinx。我编写了以下 .sh 脚本

unbuffer pocketsphinx_continuous -innmic yes > pipe 我想使用(shell/sh)调用这个过程。

Unbuffer 允许 Pocketsphinx 正确地将其数据刷新到可以逐行读取的管道中。

我遇到的问题是我不知道如何正确终止进程。它将永远运行并且永远不会返回控制权。如果我杀死它正在运行的线程,则 sh 命令产生的进程仍然运行。我能想到的唯一的事情是运行killpid

Pio*_*dyl 3

clojure.java.shell/sh在正在执行的进程完成之前不会返回,并且您需要使用另一个线程来对 pid 使用kill。

另一种解决方案是使用java.lang.Runtime.execorjava.lang.ProcessBuilder获取java.lang.Process提供类似destroyor方法的实例destroyForcibly

如果您仍然希望拥有一个不错的 Clojure API,并且仍然能够运行命令并指定进程完成的超时,并且仍然获得输出,直到超时发生,您还可以使用Raynes/conch库。