Scala 如何使用capistrano在远程计算机上启动play2应用程序

Scala 如何使用capistrano在远程计算机上启动play2应用程序,scala,capistrano,playframework-2.0,Scala,Capistrano,Playframework 2.0,我正在尝试使用capistrano部署play2应用程序,但我不知道如何在成功部署后(重新)启动play2应用程序。仅触发“播放开始”将导致进程挂起,等待我按ctrl+D 我在play app根文件夹中创建了一个开始脚本 #!/bin/bash nohup bash -c "/var/lib/play2/play start &>> /tmp/myapp.log 2>&1" &> /dev/null & 当我在服务器上运行它时,效果非常

我正在尝试使用capistrano部署play2应用程序,但我不知道如何在成功部署后(重新)启动play2应用程序。仅触发“播放开始”将导致进程挂起,等待我按ctrl+D

我在play app根文件夹中创建了一个开始脚本

#!/bin/bash

nohup bash -c "/var/lib/play2/play start &>> /tmp/myapp.log 2>&1" &> /dev/null &
当我在服务器上运行它时,效果非常好。当我尝试通过ssh从本地计算机调用此函数时,它也可以工作。但当我使用capistrano时,它似乎没有任何作用。我的capistrano配置如下所示:

namespace :deploy do

  task :restart do
    stop
    sleep 1
    start
  end

  task :start do
    run "cd #{current_release}/trip-api && ./start.sh"
  end

  task :stop do
    run "cd #{current_release}/trip-api && ./stop.sh"
  end
end

在远程机器上启动play2应用程序的最佳方式是什么?如何让它与capistrano一起工作?

谷歌集团提供了一些关于运行应用程序的新鲜话题:


跟随或加入他们是个不错的主意

请查看

推荐的方法是使用

play clean compile stage
然后运行它

$target/start

要停止,请查看以下文档:

服务器的进程id将在引导时显示并写入 正在运行\u PID文件。要杀死正在运行的播放服务器,只需发送 向进程发送SIGTERM以正确关闭应用程序

在这一点上,它展示了另一种方法和如何实现

基本上,您可以这样开始:

APP_COMMAND="${OPENSHIFT_REPO_DIR}target/start $PLAY_PARAMS "\
"-Dhttp.port=${OPENSHIFT_INTERNAL_PORT} "\
"-Dhttp.address=${OPENSHIFT_INTERNAL_IP} "\
"-Dconfig.resource=openshift.conf"

echo $APP_COMMAND &>> $LOG_FILE
nohup bash -c "${APP_COMMAND} &>> ${LOG_FILE} 2>&1" &> /dev/null &
为了阻止它

pid=`cat RUNNING_PID`
echo "Stopping play application" >> $LOG_FILE
kill -SIGTERM $pid

我建议使用runit。我们目前正在生产中运行一系列服务,效果非常好

它只需要创建一个名为run的简单shell脚本,将runit指向它的包含目录,然后启动它。服务不应该自己后台监控,也不应该运行它控制pid文件等

有一个命令(
sv
)用于启动、停止和查询服务。(
sv start | stop | status |重启应用程序

虽然我根本不用capistrano,但粗略的谷歌搜索让我明白了这一点,所以我无法保证它的有用性

常见问题解答是最好的开始:

在debian中,您只需
安装runit
,就可以了。
更新服务--add/your/service/dir/
将向runit注册服务


在部署时,我们停止服务,更改二进制文件并启动服务;这真的很简单。

谢谢你的澄清,但这并不能解决我的问题。当我在服务器上本地运行它时,这是可行的,但由于某些原因(例如,使用capistrano),我无法远程触发它。我根据您的建议使它工作(请参阅)解决方案的关键是不使用capistrano的默认修订版+符号链接(当前)目录结构,因为正在运行的_PID文件将保留在旧版本的子目录中,脚本无法再停止应用程序。我将此标记为一个答案,因为我认为这是部署play应用程序的最佳方式听起来是一个可行的解决方案,但我的问题确实针对play应用程序。如果我能让它与runit一起工作,我会试试。它可以与任何类型的应用程序一起工作。如果你成功了,请发回你的经历。