如何运行sbt作为守护进程?

时间:2016-11-16 22:05:24

标签: linux ubuntu sbt

我已尝试nohup "sbt run" &

返回:nohup: failed to run command ‘sbt run’: No such file or directory

并尝试:

nohup sbt run &
[2] 7897
# nohup: ignoring input and appending output to ‘nohup.out’

当我回来期待过程继续运行时,我收到:

[2]+  Stopped                 nohup sbt run

如何将sbt作为守护进程运行?

更新:

sbt run </dev/null &
[5] 8961

我认为上传一个目录:

# cd ..

[5]+  Stopped                 sbt run < /dev/null  (wd: /home/sum)
(wd now: /home)

所以它作为守护进程启动,但如果我执行任何操作,例如更改dir,它会杀死进程吗?如何让流程继续运行?

5 个答案:

答案 0 :(得分:10)

看起来sbt已从您的终端请求输入。如果它确实不需要输入(在后台运行程序时可能就是这种情况),你可以像这样运行它:

sbt run </dev/null >output-file &

有关详细信息,请参阅this answer

修改

好的,现在这是个谜题。简答:运行sbt如下:

setsid nohup sbt run &

理由:

sbt停止的原因是SIGTTOU信号的到来。在几种情况下,它会传递给后台进程,其中包括修改终端配置。这是我们的情况,因为根据strace -f sbt run &sbt在这个引擎盖下做了很多黑魔法:

[pid 16600] execve("/usr/bin/sh", ["sh", "-c", "stty -g < /dev/tty"], [/* 75 vars */] <unfinished ...>

要解决此问题,您可以在另一个会话中运行sbt以将其从当前终端分离,这样它就不会打开/ dev / tty并弄乱我们的终端。

答案 1 :(得分:1)

这也应该起作用

sbt -Djline.terminal=jline.UnsupportedTerminal run &

来源:https://github.com/sbt/sbt/issues/701

答案 2 :(得分:0)

oleg-andriyanov的回答在我的案子中没有用。 (发布后很快就会退出)

在这种情况下,请尝试以下面的游戏ML编写的Mirko Stocker命令替代。 https://groups.google.com/forum/#!topic/play-framework/ZgjrPgib0-8

# screen -d -m sbt run

答案 3 :(得分:0)

您可以轻松地使用tmux进行此操作(并继续执行其他操作)。一个额外的功能是,如果您安装在远程服务器上,则可以将作业作为“会话”持久保存,并重新连接到同一终端“会话”。 https://www.linode.com/docs/networking/ssh/persistent-terminal-sessions-with-tmux/

1)启动您的sbt工作

sbt
run

2)与tmux会话分离

ctrl+b (then release)
d

3)显示活动的tmux会话(仅发生在本地tmux)

ctrl + b 
s

4)显示远程计算机上的所有会话

$ tmux a

5)附加会话

$ tmux attach-session (your-session-number)

答案 4 :(得分:0)

如果您已经运行了sbt并想将其移至后台,则一旦进程处于STOPPED状态,请通过以下方式向其发送CONTINUE信号

kill -s SIGCONT PID 

kill -s SIGCONT JOB_NUMBER

这将确保sbt进程现在在后台运行。