我有一个Meteor应用程序,我正在使用CodeDeploy在EC2实例上部署(本地构建->S3->CodeDeploy->EC2)。
我遇到了一个一周前没有的问题:创建部署时,它在ApplicationStop步骤失败,并显示消息
[stderr]bash: /opt/codedeploy-agent/deployment-root/.../scripts/stop.sh: /bin/sh^M: bad interpreter: No such file or directory
我知道这应该是Windows风格的行尾问题,但看起来不是
~$ md5sum stop.sh
d41d8cd98f00b204e9800998ecf8427e stop.sh
~$ dos2unix stop.sh
~$ md5sum stop.sh
d41d8cd98f00b204e9800998ecf8427e stop.sh
如果我在十六进制编辑器中打开文件,则行结尾看起来像0x0a,而不是x0d0a 可以肯定的是,我从S3下载了部署档案,提取了它并再次检查——行的结尾确实如上所述。 这很奇怪,因为我大约一周前还没有遇到这个问题,如果我尝试部署一周前成功部署的版本,也会出现同样的问题(!!)。。。即使当时它还在工作。 感谢帮助! [Update]:从我的stop.sh脚本 [Update 2]:我发现由于某种原因,CodeDeploy在实例上使用了错误的部署存档。屏幕截图如果我转到 感谢00000000:2321 2f62 696e 2f73 680a736f 7572 6365#/bin/sh.source00000010:202f 686f 6d65 2f65 6332 2d75 7365 722f/home/ec2用户/。。。
/bin/sh
中删除第一行不会更改任何内容。我想sudo ln -s /bin/sh /bin/sh^M
应该适用于脏的快速修复,但我想要一个更干净的解决方案。://opt/codedeploy-agent/.../d-GBQV1EHSE
,这确实是一个旧的部署,有Windows样式的行返回问题。。。但是CodeDeploy不应该使用此存档/opt/codedeploy-agent/.../d-XWEJW9SVE
存在并且包含有效的存档。
与christophed讨论后,我们发现配置中存在问题,指向另一个(旧的)stop.sh,它确实具有Windows风格的CRLF。
因此,更新配置解决了他的问题。
我得到了这个问题的解决方案。这很简单。
当使用appspec.yml文件时,我们的操作系统是linux,但当我们在Windows中使用VSCODE从系统提交代码时,所有文件都是DOS格式,我们需要将其更改为unix格式,并需要从GIT BASH推送代码,而不是从VSCODE终端推送代码。
- 跟踪GIT BASH中本地GIT存储库文件夹中的所有文件
- 使用VI/VIM编辑器打开文件,点击键盘按钮ESCAPE,键入:set ff=unix并使用:wq!保存文件
您还可以看到下面的文章将文件从DOS转换为Unix格式。
https://www.studytonight.com/post/solved-getting-error-while-executing-a-sh-file-binbashm-bad-interpreter
-
提交代码并将其推送到您的远程回购。
-
再次运行部署,并确保检查Codedeploy代理是否正在运行您的系统。