sealed trait ResultLine { def line: String } final case class Out(line: String) extends ResultLine { override def toString: String = s"OUT: $line\n" } final case class Err(line: String) extends ResultLine { override def toString: String = s"ERR: $line\n" } final case class ProcessResult(output: Seq[ResultLine], exit: Int) private def executeProcess(cmd: String, parameters: Seq[String]): ProcessResult = { import scala.sys.process._ val results = new ConcurrentLinkedQueue[ResultLine] val status = Process(cmd, parameters).run(ProcessLogger( out ⇒ results.add(Out(out)), err ⇒ results.add(Err(err)) )).exitValue() val builder = Seq.newBuilder[ResultLine] while(!results.isEmpty) { builder += results.poll() } ProcessResult(builder.result(), status) }