2

如何sbt在退出ssh会话后保持进程,特别是通过命令生成的进程?以下相关问题[1][2][3][4]提供了丰富的信息,但在我的特定案例中并未导致明确的解决方案。简要背景:我有三台服务器代表组成集群的节点,每个节点上运行相同的程序来分配计算密集型任务。此过程旨在始终在机器启动时运行,即每台服务器都专用于该项目。每个节点都有以下内容(当我有机会重新登录时,我将使用正确的信息更新它):

Ubuntu 12.04.2 LTS
JVM X.X.X (is JDK 1.7 update 24+)
Scala X.X.X
sbt X.X.X

我通过我的大学网络访问每个节点ssh。我已经尝试tmux分离会话,但只要我自己的笔记本电脑没有重新启动,这只会使该过程持续存在。我采取以下步骤在每个节点上启动程序:

  1. 通过以下方式登录每个节点ssh user@host -p port
  2. 导航到适当的目录并使用sbt*启动我的程序
  3. 在控制台中发出run命令sbt

* 实际命令是sbt -Dgeotrellis cluster_seed_ip=xxx.xxx.xxx.xxx

是采取disown还是nohup最合适的方法?给定一个或另一个答案,我需要发出什么特定且语法正确的命令(如果使用该方法,则从sbt控制台disown发出)以便sbt进程与我的用户帐户解除关联并在我退出ssh会话后继续运行?

4

3 回答 3

5

看起来 SBT 挂在后台是 JLine 问题。有一个解决方法:

sbt -Djline.terminal=jline.UnsupportedTerminal about &

只需将此标志添加到您要在后台运行的任何 SBT 命令。

于 2016-10-06T14:05:15.683 回答
2

将 sbt 作为守护进程运行并不是一件容易的事。
大多数建议都使用sbt-assembly

如果你不想使用 sbt-assembly,你可以先打包你的 scala 应用程序,然后用 scala 命令运行它。

对我来说,这些命令是这样的,在你退出 ssh 后,scala 将继续运行:

sbt clean package
nohup scala ./target/scala-2.10/trafficgenerator_2.10-1.0.jar &
于 2013-11-08T04:55:36.237 回答
2

它甚至更常见。尝试输入sbt clean &sbt compile &。进程已创建,但不会完成。

使用以下方法解决您的问题tmxux

tmux new -d -s $$ && tmux send -t $$ 'SHELL_COMMAND' ENTER

在您的上下文中SHELL_COMMAND=sbt -Dgeotrellis cluster_seed_ip=xxx.xxx.xxx.xxx

你也可以tmux在后面使用byobu

byobu new -d -s $$ && tmux send -t $$ 'SHELL_COMMAND' ENTER

之后,如果您键入,byobu则输入命令会话。

于 2016-09-22T14:05:40.597 回答