Node.js AWS Codedeploy错误:脚本/applicationstart.sh不可执行。试图使其可执行

Node.js AWS Codedeploy错误:脚本/applicationstart.sh不可执行。试图使其可执行,node.js,bash,amazon-web-services,aws-code-deploy,Node.js,Bash,Amazon Web Services,Aws Code Deploy,我正在EC2实例上运行Ubuntu,并试图设置代码部署以运行脚本,以便在appspec.yml中提供部署。但是,这些钩子脚本似乎没有运行。当我检查代码部署错误日志时,我看到错误消息InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor:指定位置的脚本:scripts/applicationstart.sh不可执行。正在尝试使其可执行。 这是非常混乱的,因为我的脚本非常简单,我不知道为什么它们不会被接受。以下是在appspec.yml文件中调用

我正在EC2实例上运行Ubuntu,并试图设置代码部署以运行脚本,以便在appspec.yml中提供部署。但是,这些钩子脚本似乎没有运行。当我检查代码部署错误日志时,我看到错误消息
InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor:指定位置的脚本:scripts/applicationstart.sh不可执行。正在尝试使其可执行。

这是非常混乱的,因为我的脚本非常简单,我不知道为什么它们不会被接受。以下是在appspec.yml文件中调用它们的位置:

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/teller-install
hooks:
  BeforeInstall:
    - location: scripts/beforeinstall.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: scripts/applicationstart.sh
      timeout: 300
      runas: root
以下是我在此调用的两个脚本:

#!/bin/bash

cd /home/ubuntu/teller-install/Server && npm install
exit 0
第二点:

    #!/bin/bash

pm2 start /home/ubuntu/teller-install/Server/app.js
exit 0
部署成功,但脚本未运行

以下是我在codedeploy代理日志文件中得到的错误消息:

    2017-06-01 23:59:01 WARN  [codedeploy-agent(3504)]: InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor: Script at specified location: scripts/applicationstart.sh is not executable.  Trying to make it executable.
2017-06-01 23:59:01 INFO  [codedeploy-agent(3504)]: Version file found in /opt/codedeploy-agent/.version.
2017-06-01 23:59:01 INFO  [codedeploy-agent(3504)]: [Aws::CodeDeployCommand::Client 200 0.028596 0 retries] put_host_command_complete(command_status:"Succeeded",diagnostics:{format:"JSON",payload:"{\"error_code\":0,\"script_name\":\"\",\"message\":\"Succeeded\",\"log\":\"\"}"},host_command_identifier:"WyJjb20uYW1hem9uLmFwb2xsby5kZXBsb3ljb250cm9sLmRvbWFpbi5Ib3N0Q29tbWFuZElkZW50aWZpZXIiLHsiZGVwbG95bWVudElkIjoiQ29kZURlcGxveS91cy1lYXN0LTEvUHJvZC9hcm46YXdzOnNkczp1cy1lYXN0LTE6MDEwNzAyMDY3ODAwOmRlcGxveW1lbnQvZC1LWFU2WjQ0UU0iLCJob3N0SWQiOiJhcm46YXdzOmVjMjp1cy1lYXN0LTE6MDEwNzAyMDY3ODAwOmluc3RhbmNlL2ktMGNkMzQ3OThlNDdiYzE3MjkiLCJjb21tYW5kTmFtZSI6IkFwcGxpY2F0aW9uU3RhcnQiLCJjb21tYW5kUG9zaXRpb24iOjYsImNvbW1hbmRBdHRlbXB0IjoxfV0=")  
这是我正在谈论的文件的源代码


好的,在经历了很多挫折之后,我解决了这个问题。首先,我必须使用chmod 777
scriptname.sh来更改脚本的权限,但您需要给它们比实际更严格的权限。这消除了那个恼人的错误信息


然后,脚本不起作用的原因是因为我的脚本在安装挂钩之前安装了依赖项,这是在任何文件出现之前调用它。我不得不在安装后将依赖项安装移到中,一切都很正常。希望这能帮助任何有类似问题的人。

我认为这里有一点误解。这是可以理解的,因为CodeDeploy在解释它方面做得很差

警告
。。。是不可执行的。试图使其可执行。
有点像是在转移注意力。请参阅OP代码片段的下一行,其中指出它确实成功地将脚本设置为可执行:
put\u host\u command\u complete(命令状态:“successed”…

因此,您根本不必设置
钩子
脚本的权限-CodeDeploy会为您解决这一问题

请注意,还有一个恼人的特性。CodeDeploy不会从您选择的代码位置(例如,
/srv/my cool app/scripts/beforeinstall.sh
)执行
钩子
脚本。它实际上会复制整个部署并将其存储在
/opt/CodeDeploy agent/deployment root/[some guid]/[最新文件夹]/deployment archive/
。这是它运行
钩子
脚本的地方。您可以通过转到该文件夹并在那里检查脚本的权限来查看这方面的证据-CodeDeploy代理运行的脚本将是777


此外,虽然您可以在appspec.yml文件中放置
权限
部分,但它需要绝对路径,这同样只允许您编辑部署位置,而不允许编辑脚本实际运行的/opt位置。

我们可以查看部署剧本(或任务)吗?您好,对不起,请澄清这是什么?谢谢!这些脚本是如何进入您管理的服务器的?它们托管在github中,并通过codedeploy安装在服务器上。您检查了它们的权限吗?它们是否可执行?您如何使更改权限脚本可执行?@Atma如何使脚本可执行?@Atma chmod+x scripts/*看,这简直是疯了。从脚本内部运行类似于
touch random file name
的操作不会在部署目标中创建文件,也不会在/opt/…路径中创建文件