概述在远程服务器上部署,启动和停止Scala应用程序
在远程linux服务器上部署Scala应用程序的首选方法是什么?
这是在远程服务器上部署Scala应用程序的一种相当简单而有限的方式(很适合快速testing不太敏感的项目):
从远程服务器,我从git拉我的来源
使用sbt-assembly插件,我在服务器上构build一个jar
然后我使用nohup运行Scala应用程序,它允许您退出远程会话而不终止进程:
nohup java -jar myapp.jar> myapp.log 2> myapp.err </ dev / null&
首先,考虑到正在使用数据库等资源,停止进程的最佳方法是什么?我只是查找java进程ID并将其加以核实?
其次,在重新启动时自动启动Java应用程序的最佳方法是什么? 我记得过去使用过init.d,但是记得自从它是一个Java应用程序以来就有些艰难。
更新:
我错过了这里的房间里的大象。 我使用喷雾库,反过来使用阿卡,所以提供了一些有趣的选项。
有许多方法去皮肤猫…
你可以使用sbt-start-script https://github.com/sbt/sbt-start-script ,甚至可以使用sbt-native-packager https://github.com/sbt/sbt-native-packager
您可以将Spray的Boot示例脚本封装在一个简单的init.d脚本中,该脚本调用sbt,详见本答案https://stackoverflow.com/a/17399574/155689 ,或者使用plain nohup java命令。
您可以创建更大的守护进程感知的类和脚本,或者使用使用Jsvc http://commons.apache.org/proper/commons-daemon/Jsvc.HTML或Java Service Wrapper的init.d脚本来扩展这些脚本。 http://wrapper.tanukisoftware.com/
守护进程和应用程序类的一个例子:
package com.example.myapplication.server import akka.actor.{Props,ActorSystem} import spray.can.http import akka.io.IO import com.example.myapplication.API.MyServiceActor import org.apache.commons.daemon._ trait Applicationlifecycle { def start(): Unit def stop(): Unit } abstract class AbstractApplicationDaemon extends Daemon { def application: Applicationlifecycle def init(daemonContext: DaemonContext) {} def start() = application.start() def stop() = application.stop() def destroy() = application.stop() } class ApplicationDaemon() extends AbstractApplicationDaemon { def application = new Application } object ServiceApplication extends App { val application = createApplication() def createApplication() = new ApplicationDaemon private[this] var cleanupAlreadyRun: Boolean = false def cleanup(){ val prevIoUslyRun = cleanupAlreadyRun cleanupAlreadyRun = true if (!prevIoUslyRun) application.stop() } Runtime.getRuntime.addShutdownHook(new Thread(new Runnable { def run() { cleanup() } })) application.start() } class Application() extends Applicationlifecycle with Logging { private[this] var started: Boolean = false private val applicationname = \”MyApplication\” implicit val actorSystem = ActorSystem(s\”$applicationname-system\”) def start() { logger.info(s\”Starting $applicationname Service\”) if (!started) { started = true val myService = actorSystem.actorOf(Props[MyServiceActor],\”my-service\”) IO(http) ! http.Bind(myService,interface = \”0.0.0.0\”,port = 8280) } } def stop() { logger.info(s\”StopPing $applicationname Service\”) if (started) { started = false actorSystem.shutdown() } } }
如果您在/opt/myapplication/myapplication.jar中部署jar(对胖jar使用sbt-assembly), /opt/myapplication/myapplication.jar在/etc/mycompany文件夹中添加一些外部配置,然后可以将其包装在/etc/init.d/myapplication脚本,例如使用Jsvc:
#!/bin/sh ### BEGIN INIT INFO # ProvIDes: myapplication # required-Start: $local_fs $remote_fs $network # required-Stop: $local_fs $remote_fs $network # Should-Start: $named # Should-Stop: $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Control myapplication # Description: Control the myapplication daemon. ### END INIT INFO set -e if [ -z \”${JAVA_HOME}\” ]; then JAVA_HOME=$(readlink -f /usr/bin/java | sed \”s:/bin/java::\”) fi JAVA_OPTS=\”-xms512m -Xmx1024m\” APP=myapplication PID=/var/run/${APP}.pID OUT_LOG=/var/log/myapplication/${APP}_out.log ERR_LOG=/var/log/myapplication/${APP}_err.log DAEMON_USER=yourserviceuser APP_LOG_CONfig=/etc/mycompany/${APP}_logback.xml APP_CONfig=/etc/mycompany/${APP}.conf APP_HOME=/opt/${APP} APP_CLAsspATH=$APP_HOME/${APP}.jar APP_CLASS=com.example.myapplication.server.ApplicationDaemon if [ -n \”$APP_LOG_CONfig}\” ]; then JAVA_OPTS=\”-Dlogback.configurationfile=${APP_LOG_CONfig} ${JAVA_OPTS}\” fi DAEMON_ARGS=\”-home ${JAVA_HOME} -Dconfig.file=${APP_CONfig} ${JAVA_OPTS} -pIDfile ${PID} -user ${DAEMON_USER} -outfile ${OUT_LOG} -errfile ${ERR_LOG} -cp ${APP_CLAsspATH} ${APP_CLASS}\” . /lib/lsb/init-functions case \”$1\” in start) log_daemon_msg \”Starting ${APP}\” cd ${APP_HOME} && Jsvc ${DAEMON_ARGS} log_end_msg 0 ;; stop) log_daemon_msg \”StopPing ${APP}\” cd ${APP_HOME} && Jsvc -stop ${DAEMON_ARGS} log_end_msg 0 ;; *) log_success_msg \”Usage: {start|stop}\” echo \”Usage: {start|stop}\” exit 1 ;; esac exit 0
有了这个,你现在可以sudo service myapplication start|stop
如果提到你想让它在启动时自动启动,那么运行这个命令
sudo update-rc.d myapplication defaults
这个守护进程的方法与我有喷雾应用程序。
如果maven是合适的,那么可以使用下面的插件: http : //evgeny-goldin.com/wiki/Sshexec-maven-plugin
可能它可以很容易地移植到sbt
总结
以上是内存溢出为你收集整理的在远程服务器上部署,启动和停止Scala应用程序全部内容,希望文章能够帮你解决在远程服务器上部署,启动和停止Scala应用程序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容