Amazon web services CodeDeploy AfterInstall钩子在启动Go服务器后不退出

Amazon web services CodeDeploy AfterInstall钩子在启动Go服务器后不退出,amazon-web-services,aws-code-deploy,Amazon Web Services,Aws Code Deploy,我有一个简单的Go服务器。代码如下。server.go package main import ( "fmt" "log" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) } func

我有一个简单的Go服务器。代码如下。server.go

package main

import (
    "fmt"
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}
我有一个带有CodeDeploy代理的EC2服务器,一切都准备就绪。我所要做的就是,一旦我将新代码与Github repo的主分支推送并合并,CodeDeploy应该将修订版部署到我的EC2服务器上,下面是我的appspec.yml(它位于我的repo的根目录下)

appspec.yml

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/go/myproject
hooks:
  AfterInstall:
  - location: after-install.sh
    runas: ubuntu
下面是after-install.sh脚本。非常简单,将修订版部署到EC2中的myproject文件夹后,将cd放入该文件夹并启动go服务器

#!/bin/bash

cd $HOME/go/myproject
/usr/local/go/bin/go run server.go &
问题:有了上述修订,就可以完美地部署修订版并启动服务器,我可以从浏览器点击端口8080上的公共dns并查看更改。但是,CodeDeploy仍在运行,并且从未显示部署已完成。

在启动Go服务器后,我是否应该为CodeDeploy做些什么才能正常完成?

根据建议,您不应该这样做

您不能简单地在after-install.sh中添加一个符号(&),以便在后台运行sleep.sh

如果下面是你的钩子文件

#!/bin/bash
# Do not do this.
/tmp/sleep.sh &
您需要在
&
之前添加
/dev/null 2>/dev/null
,如下所示

#!/bin/bash
/tmp/sleep.sh > /dev/null 2> /dev/null < /dev/null &
#/bin/bash
/tmp/sleep.sh>/dev/null 2>/dev/null
对于您的文件,它应该更新为如下所示

#!/bin/bash

cd $HOME/go/myproject
/usr/local/go/bin/go run server.go > /dev/null 2> /dev/null < /dev/null &
#/bin/bash
cd$HOME/go/myproject
/usr/local/go/bin/go run server.go>/dev/null 2>/dev/null
它处于什么阶段?也是在配置了CodeDeploy的负载平衡器后面吗?在执行after-install.sh之后,它卡在AfterInstall钩子中,因为我看到服务器启动了。不,EC2目前不在负载平衡器后面。在CodeDeploy控制台中,我看到微调器一直旋转,可能会这样做,因为默认超时为3600,然后失败。如果您自己运行安装后脚本,它是否也会挂起?太棒了!非常感谢。工作。对于长时间运行的流程,我没有阅读这部分文档。