2016-03-31 20 views
1

のInputStreamを監督私は、次のbashスクリプトを起動し、非同期的にその標準出力をキャプチャしようとしている:ここでが生成されたプロセス

#!/bin/bash 

sleep 2; 
echo "one"; 
sleep 2; 
echo "two"; 
sleep 2; 
echo "three"; 
# ... possibly infinite.. 

は、Javaコードは、これまでのところです:

ProcessBuilder pb = new ProcessBuilder("sleeper"); 
Process process = pb.start(); 
InputStream input = process.getInputStream(); 

// now I continue in pseudo-code: 

supervise the input-stream. 
whenever a new line arrives: 
    check if the line equals "two"; 
     then: doSomeAction(); 

注:I実際にJavaでプログラムを書いているわけではありません。私はClojureに書いていますが、私はまだClojureのアプローチを見つけていません。だから私はClojureでラップされたJavaネイティブAPIを使用しようとしています。


nodejs例

カントーはもう少し私の意図を明確に、ここでは正確に行いNode.jsのためのJavaScriptコードは、私が欲しいものです:

const spawn = require('child_process').spawn; 
const sleeper = spawn('sleeper'); 

sleeper.stdout.on('data', (data) => { 
    if (data.toString() === "two\n") { 
     doSomeAction(); 
    } 
}); 
+0

入力ストリームの処理を別のスレッドで行い、別のスレッドから制御しますか?または、特定のデータを取得するまで、またはプロセスが終了するまで、プロセスを処理する必要がありますか? –

+0

いいえ、私が判断できる限り、別のスレッドは必要ありません。サブプロセス(「スリーパー」)は、重い計算アプリケーションではありません。それは実際には小さなサーバーを実行するUnixツールなので、実際は無限に動作します。しかし、私のアプリケーションにとって重要なことは、サブプロセスを監督している間にブロックされていないことです。それ以外のものはすべて続行する必要があります。 –

答えて

2

することができますclojure.java.ioのツールを簡単なJava相互運用機能とともに使用してください。

ここでは、始めるためにいくつかのコードです:

(require '[clojure.java.io :refer [reader]]) 

(let [process (.start (ProcessBuilder. ["./sleeper"]))] 
    (with-open [r (reader (.getInputStream process))] 
    (doseq [line (line-seq r)] 
     (when (= line "two") 
     (println line))))) 

があなたのREPLにこれを貼り付け、あなたは適切な遅延の後two出力されているが表示されるはずですが。

+1

メインアプリケーションのスレッドがブロックされず、実行を継続できるように、 'future'にラップすることもできます。 –

+0

@PiotrekBzdyl。 - 私は、問題がメインスレッドをブロックしない解決策を求めていることに気づいただけです。私は、プログラムがメインスレッドで何をしているか知らずに答えられないように感じます...幸運! – glts

+0

nice!これはまさにそれがすべきことです.. –

関連する問題