2013-02-25 100 views

回答

12

如前所述in the doc

当您运行启动命令,播放叉一个新的JVM,并运行默认Netty的HTTP服务器。标准输出流被重定向到Play控制台,因此您可以监控其状态。

服务器的进程ID在引导时显示并写入RUNNING_PID文件。要杀死正在运行的Play服务器,向进程发送SIGTERM以正确关闭应用程序就足够了。

如果您键入Ctrl + D,Play控制台将退出,但创建的服务器进程将继续在后台运行。然后关闭分叉的JVM的标准输出流,并且可以从logs/application.log文件中读取日志记录。

所以我认为你必须使用play run而不是play start。然后你可以使用Ctrl + D停止播放。

+1

令人讨厌的是,他们如何从Play 1中改变了这么多简单的语义。“play start”意味着完全不同的东西,并且生产是通过完全不同的方式实现的。 – ripper234 2013-02-25 20:48:43

+1

是的,它是完全不同的;你将不得不重新学习(几乎)所有的东西:-( – 2013-02-25 20:52:30

+0

'play run'运行在开发模式下,它是用于开发而不是生产的。 – 2015-01-01 14:35:09

0

只需在控制台窗口中按下Ctrl + D即可。

+0

存在控制台,但进程保持不变。 – ripper234 2013-02-25 20:29:26

+1

是的,你说得对。我总是在开发中使用play run,并且CTRL + D正常工作。在生产中你需要杀死这个过程。 – disperse 2013-02-25 20:51:25

8

如果您使用play start命令运行应用程序,则从app目录发出play stop命令可以正常工作,并且会停止正在运行的应用程序服务器。

我通过Play 2.1.1验证了这一点。

16

Windows我使用下面的脚本来杀死当前正在运行的游戏服务器

@echo off 
if exist RUNNING_PID (
    setlocal EnableDelayedExpansion 
    set /p PLAY_PID=<RUNNING_PID 
    echo killing pid !PLAY_PID! 
    taskkill /F /PID !PLAY_PID! 
    del RUNNING_PID 
    endlocal 
) 
+1

很好用。你有什么技巧可以在Windows上启动Play应用程序吗?目前我正在使用“play start”,但我正在考虑编写一个脚本,在服务器重新启动后自动启动应用程序。理想的情况是将应用程序封装在Windows服务中,但从我看到的情况来看,这似乎并不简单。 – Ian 2014-03-17 10:26:33

+0

+1 - 这适用于我们。我在我们的开发和测试环境的每个子文件夹中使用它。 – rishimaharaj 2014-07-14 16:25:39

+0

@Ian几年后,但对于社区:查看“运行”和“运行启动”之间的区别 - > http://stackoverflow.com/a/16291499/1579667 – Benj 2017-03-13 08:30:20

0

要做到这一点,你可以修改build.sbt文件as described here

TaskKey[Unit]("stop") := { 
    val pidFile = target.value/"universal"/"stage"/"RUNNING_PID" 
    if (!pidFile.exists) throw new Exception("App not started!") 
    val pid = IO.read(pidFile) 
    s"kill $pid".! 
    println(s"Stopped application with process ID $pid") 
} 

但是,这只适用于* nix系统。

9

您可以运行此脚本:

kill $(cat /your-play-project-path/target/universal/stage/RUNNING_PID) 
0

你可以叫<your_server_url>/@kill,例如:http://localhost:9022/app3/@kill