2013-02-25 99 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