Play Framework启动后立即停止,如何后台运行sbt run?
解决sbt run后台启动后立即停止的问题
这问题我之前折腾过好几次,本质是你的服务器程序启动时在监听标准输入(stdin)——前台运行时stdin连着你的终端,程序会乖乖等你按键;但用&把进程丢到后台后,stdin会被直接断开,程序误以为你按下了任意键,所以直接退出了。下面给你几个实用的解决办法:
1. 用nohup彻底分离进程与终端
这是最常用的后台启动方式,能让进程完全脱离终端控制,哪怕你关闭当前终端也不会停止:
nohup sbt run > server.log 2>&1 &
nohup:让进程忽略终端关闭时发送的HUP信号,避免被强制终止> server.log:把程序的标准输出重定向到日志文件,方便后续排查启动或运行问题2>&1:把错误输出也同步写到日志文件里,不会遗漏任何报错信息
启动后可以用ps aux | grep sbt或者pgrep -f sbt查看进程是否正常运行。
2. 禁用程序的交互提示
如果你的服务器代码里写了“按任意键继续”这类交互逻辑,直接去掉这块代码是最彻底的——服务器本就应该后台静默运行,根本不需要手动交互。如果是第三方框架自带的交互提示,看看有没有启动参数可以禁用,比如很多框架支持--no-interactive或--non-interactive参数:
sbt "run --no-interactive" &
这样程序启动时不会等待输入,后台运行自然就不会触发退出逻辑了。
3. 用终端复用工具(screen/tmux)
如果你需要偶尔查看控制台输出或者临时调试,用screen或tmux是个很灵活的选择:
- 先安装screen(以Ubuntu为例):
sudo apt install screen - 启动screen会话:
screen - 在会话里执行
sbt run,等待服务器启动完成 - 按
Ctrl+A+Ddetach(脱离)当前会话,此时进程会在后台持续运行 - 之后想重新查看输出,执行
screen -r就能回到之前的会话
tmux的用法类似,只是快捷键不同,适合习惯用tmux的用户。
4. 打包成Jar包后台运行
直接用sbt run后台运行其实不算最优解,因为sbt本身是构建工具,额外的开销可能导致不稳定。建议先把程序打包成可执行Jar:
- 先在
project/plugins.sbt里添加assembly插件:addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.2.0") - 执行
sbt assembly打包,生成的Jar包一般在target/scala-xxx/目录下 - 用nohup启动Jar包:
nohup java -jar your-server.jar > server.log 2>&1 &
这种方式是纯Java进程运行,稳定性比直接用sbt run高很多。
内容的提问来源于stack exchange,提问作者Adel Chepkunov




