繁体   English   中英

将服务器服务部署到AWS EC2实例:如何配置ApplicationStart和ApplicationStop

[英]Deploying a server service to AWS EC2 instance: how to config ApplicationStart and ApplicationStop

我正在尝试将服务器服务部署到AWS EC2实例。 这项服务基本上是永远运行的消费者。

要在AWS上部署,似乎我需要指定以下文件:

  • appspec
  • beforeInstall
  • afterInstall
  • applicationStart
  • applicationStop

我在编写applicationStart和applicationStop脚本时遇到麻烦。 我的程序是一个Java jar文件,我使用java -jar consumer.jar执行了它。 因此,首先我编写了applicationStart和applicationStop,如下所示:

ApplicationStart:

java -jar consumer.jar

ApplicationStop:

exit 0

这是appspec文件的片段

hooks:
  ApplicationStop:
    - location: script/deploy/stop-application.sh
      timeout: 30
      runas: root
  BeforeInstall:
    - location: script/deploy/before-install.sh
      timeout: 30
      runas: root
  AfterInstall:
    - location: script/deploy/after-install.sh
      timeout: 30
      runas: services
  ApplicationStart:
    - location: script/deploy/start-application.sh
      timeout: 30
      runas: root
  ValidateService:
    - location: script/deploy/validate-application.sh
      timeout: 30
      runas: root

将代码部署到AWS时,我发现Java程序保持运行,并且applicationStart阶段最终超时。 我认为这可能是因为Java程序不会返回,因此applicationStart根本无法完成。 因此,我将startApplication(或脚本start-application.sh)更改为如下形式

nohup java -jar consumer.jar &

这次,startApplication阶段没有超时。 相反,它需要3分钟才能成功。 考虑到我的超时时间设置为30秒,为什么不超时呢? 部署停留在AllowTraffic阶段,最终花费了1个小时超时。

关于在程序永远运行时如何编写applicationStart和applicationStop脚本的任何建议? 任何建议将不胜感激!

我想我终于找到答案了。 基本上,我们需要在命令末尾添加> /dev/null 2> /dev/null < /dev/null & ,以指示AWS忽略所有stderr和stdout。 这样,该过程将不会阻止部署。

请参阅以下参考:

  1. https://forums.aws.amazon.com/thread.jspa?threadID=181616

  2. 代码部署ApplicationStart卡在使用节点的挂起状态

  3. https://docs.aws.amazon.com/codedeploy/latest/userguide/troubleshooting-deployments.html#troubleshooting-long-running-processes

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM