什么是Play Framework 2.1的“play stop”?
如前所述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停止播放。
如果您使用play start
命令运行应用程序,则从app目录发出play stop
命令可以正常工作,并且会停止正在运行的应用程序服务器。
我通过Play 2.1.1验证了这一点。
在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
)
很好用。你有什么技巧可以在Windows上启动Play应用程序吗?目前我正在使用“play start”,但我正在考虑编写一个脚本,在服务器重新启动后自动启动应用程序。理想的情况是将应用程序封装在Windows服务中,但从我看到的情况来看,这似乎并不简单。 – Ian 2014-03-17 10:26:33
+1 - 这适用于我们。我在我们的开发和测试环境的每个子文件夹中使用它。 – rishimaharaj 2014-07-14 16:25:39
@Ian几年后,但对于社区:查看“运行”和“运行启动”之间的区别 - > http://stackoverflow.com/a/16291499/1579667 – Benj 2017-03-13 08:30:20
要做到这一点,你可以修改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系统。
您可以运行此脚本:
kill $(cat /your-play-project-path/target/universal/stage/RUNNING_PID)
你可以叫<your_server_url>/@kill
,例如:http://localhost:9022/app3/@kill
令人讨厌的是,他们如何从Play 1中改变了这么多简单的语义。“play start”意味着完全不同的东西,并且生产是通过完全不同的方式实现的。 – ripper234 2013-02-25 20:48:43
是的,它是完全不同的;你将不得不重新学习(几乎)所有的东西:-( – 2013-02-25 20:52:30
'play run'运行在开发模式下,它是用于开发而不是生产的。 – 2015-01-01 14:35:09