You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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+D detach(脱离)当前会话,此时进程会在后台持续运行
  • 之后想重新查看输出,执行screen -r就能回到之前的会话

tmux的用法类似,只是快捷键不同,适合习惯用tmux的用户。

4. 打包成Jar包后台运行

直接用sbt run后台运行其实不算最优解,因为sbt本身是构建工具,额外的开销可能导致不稳定。建议先把程序打包成可执行Jar:

  1. 先在project/plugins.sbt里添加assembly插件:
    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "1.2.0")
    
  2. 执行sbt assembly打包,生成的Jar包一般在target/scala-xxx/目录下
  3. 用nohup启动Jar包:
    nohup java -jar your-server.jar > server.log 2>&1 &
    

这种方式是纯Java进程运行,稳定性比直接用sbt run高很多。


内容的提问来源于stack exchange,提问作者Adel Chepkunov

火山引擎 最新活动