2017-09-18 8 views
1

プログラムを通過したイメージファイルが破損している、または名前が間違っている場合、無期限に実行されるコマンドラインからプログラムを実行しようとしています。私は、ファイル名が有効であることを確認するためにテストすることができますが、ルートキットがイメージを壊した場合、それは私を助けません。私の理解は、プログラムを終了する唯一の方法は、別のスレッドを作成することですが、実行が完了するまでsys.process.!!ブロックします。あなたは、その完了までProcessブロックを聞かせする必要はありませんプログラムの実行時間が長すぎる場合、Scalaでコマンドライン引数の実行を停止するにはどうすればよいですか?

import scala.concurrent.ExecutionContext.Implicits.global 

    val sb = new StringBuffer // sb for capture output 
    val io = BasicIO(false, sb, None)// Creates a `ProcessIO` that appends its output to a `StringBuffer` 
    val p = s"python vol.py -f $memFile imageinfo".run() 

    val f = Future { 
    p.exitValue() //Blocks until this process exits and returns the exit code. 
    Some(sb.toString)// return the process result 
    } 

    try { 
    val str: Option[String] = Await.result(f, Duration.apply(1, TimeUnit.SECONDS)) 
    } catch { 
    case e: TimeoutException => { 
     println("run too long") 
     p.destroy() //destroy this process when too long 
    } 
    } 

答えて

0

import scala.sys.process.{Process, ProcessLogger} 

var (iiOut, iiErr) = ("", "") // for collecting Process output 
val getii = Process(s"python vol.py -f $memFile imageinfo") 
       .run(ProcessLogger(iiOut += _, iiErr += _)) 

// . . . 
// do other useful stuff 
// or set a timeout alarm and wait for it 
// . . . 

val imageInfo: Option[String] = 
    if (getii.isAlive()) { 
    // report failure 
    getii.destroy() 
    None 
    } else if (getii.exitValue() != 0 || iiErr != "") { 
    // report failure 
    None 
    } else 
    Some(iiOut.trim) 
+1

この場合、タイムアウトはプロセスの実行を停止するとは思われません。 – pedrofurla

+0

@pedrofurla良いコール、はい、プロセスはまだ実行されます、私はタイムアウト後にプロセスを破壊することができると思います。 'ProcessIO'を使用して出力をキャプチャします。私はこれを更新します。 – chengpohi

1

:あなたが好きな、長すぎるプロセスを測定するAwaitFutureを使用することができます

val imageInfo: Option[String] = Some(s"python vol.py -f $memFile imageinfo".!!.trim) 
+0

私はこれが遅い応答であることを知っていますが、それはすばらしい答えでした。私はコードをまだ使用していません。なぜなら他のバグは積み重なっているからです。助けてくれてありがとう。 – Xander

関連する問題