SBT挂起等待孤立子进程完成

时间:2018-06-07 14:11:26

标签: scala sbt

在我的SBT(0.13.16)版本中,我有以下任务:

startThing := {
  var bin_path = s"${file(".").getAbsolutePath}/bin"
  val result = s"$bin_path/start_thing".!
  if (result != 0)
    throw new RuntimeException("Could not start Thing..")
  true
}

start_thing包含:

(run_subprocess &)

我的构建挂起。

我可以看到start_thing退出(流程表没有将其作为条目),但在任务中添加一些println表明它卡在val result = s"$bin_path/start_thing".!上。

如果我终止run_subprocess进程,则SBT解锁并正常运行。

在这种特殊情况下,run_subprocess设置了一些需要在那里进行的Kubernetes端口转发,以便后续测试能够正常工作。

2 个答案:

答案 0 :(得分:3)

尝试daemonising后台流程

(run_subprocess >/dev/null 2>&1 &)

问题可以从run_subprocess输出,仍然按照建议的here转到父级。

我能够在sbt 0.13.17和1.0.2中复制这个问题。 Daemonising在两者中都有效。

答案 1 :(得分:0)

不管我如何评论,就我而言,挂起的原因实际上是可能打开了STDOUT,STDERR在由脚本启动的守护程序中处理,这是可以的:

 /usr/local/bin/minio server "$minio_data_dir" > /dev/null 2>&1 &  # and start the server

不好,

 /usr/local/bin/minio server "$minio_data_dir" 2>&1 &  # and start the server

所以挂起是随机发生的,即使接受的答案也从后台开始... 因此,该解决方案不需要任何包装bash脚本...这就是build.sbt

中代码的外观
lazy val startLocalS3 = inputKey[Unit]("localS3")
lazy val startLocalS3Task = TaskKey[Unit]("localS3", "create local s3")
lazy val core: Project = project
   .in(file("."))
   .settings(
      name := "rfco-core",
      startLocalS3Task := {
      val cmd: Seq[String] = Seq("bash" , "-c" , "./CI/start-s3-svr.sh")
      import sys.process._
      cmd.mkString(" ").!!
     },
     fork in startLocalS3Task := true,   
     compile.in(Compile) := (compile in Compile).dependsOn((startLocalS3Task)).value
     // you might want to use Test scope ^^ here 
 )