4

Ich habe eine Meteor-Anwendung, die ich auf EC2-Instanzen mithilfe von CodeDeploy bereitstellen (lokaler Build -> S3 -> CodeDeploy -> EC2).CodeDeploy-Bereitstellung schlägt fehl: bad interpreter/bin/sh^M

ich in ein Problem betreibe ich keine Woche hatte vor: wenn Erstellen einer Einrichtung, scheitert es an der ApplicationStop Schritt mit der Meldung

[stderr]bash: /opt/codedeploy-agent/deployment-root/.../scripts/stop.sh: /bin/sh^M: bad interpreter: No such file or directory 

ich bewusst bin, dass dies eine sein sollte, Ausgabe von Windows-Stil Zeilenenden, aber es sieht aus wie es nicht

~$ md5sum stop.sh 
d41d8cd98f00b204e9800998ecf8427e stop.sh 
~$ dos2unix stop.sh 
~$ md5sum stop.sh 
d41d8cd98f00b204e9800998ecf8427e stop.sh 

ist, wenn ich die Datei in einem Hex-Editor öffnen, sucht das Zeilenende wie 0x0a und nicht 0x0d0a (Fenster s Stil).

 

    00000000: 2321 2f62 696e 2f73 680a 736f 7572 6365 #!/bin/sh.source 
    00000010: 202f 686f 6d65 2f65 6332 2d75 7365 722f /home/ec2-user/ 
    ... 

Nur um sicher zu sein, habe ich das Deployment-Archiv von S3 heruntergeladen, extrahiert und erneut überprüft - die Zeilenenden sind tatsächlich wie oben beschrieben.

Dies ist ziemlich seltsam, da ich das Problem vor einer Woche nicht hatte, und wenn ich versuche, Version, die vor einer Woche erfolgreich bereitgestellt wurde zu implementieren, tritt das gleiche Problem (!!) ... selbst wenn es war zu der Zeit arbeiten.

Hilfe geschätzt!

[Update]: die erste Zeile von meinem stop.sh Skript zu entfernen, /bin/sh, ändert nichts. Ich denke, sudo ln -s /bin/sh /bin/sh^M sollte für eine schmutzige schnelle Lösung funktionieren, aber ich hätte gerne eine sauberere Lösung. :/

[Update 2]: Ich habe festgestellt, dass CodeDeploy aus irgendeinem Grund das falsche Deployment-Archiv für die Instanzen verwendet. Screenshot Wenn ich gehe zu /opt/codedeploy-agent/.../d-GBQV1EHSE, ist dies in der Tat eine alte Bereitstellung mit einem Problem der Windows Style Line Returns ... aber CodeDeploy sollte dieses Archiv nicht verwenden /opt/codedeploy-agent/.../d-XWEJW9SVE existiert und enthält ein gültiges Archiv.

Dank

Antwort

5

Nach einem wenig mit christophetd diskutieren, fanden wir, dass es ein Problem in der Konfiguration war die zu einem anderen (alten) stop.sh hingewiesen, die in der Tat einen Windows-Stil CRLF hatten.

Aktualisierung der Konfiguration löste so sein Problem.

+0

Ich gab das Kopfgeld zu dieser Antwort, weil das Kopfgeld ablief. Wenn jemand anders eine Erklärung hat, zögern Sie bitte nicht, es zu posten! ;) – christophetd

+0

Dies ist ein alter Post, aber kann hilfreich sein - Ich denke, dass CodeDeploy den ApplicationStop Ihrer letzten Bereitstellung (oder vielleicht letzte erfolgreiche Bereitstellung?) Verwenden wird, so dass Sie in einer Schleife stecken könnten, wo Sie eine Version mit einem schlechten hochgeladen hatten ApplicationStop, mit dem Sie niemals fortfahren können. Um das zu beheben, können Sie ein Flag in der Befehlszeilenschnittstelle verwenden, das in der Konsole nicht verfügbar ist: --ignore-application-stop-failures – David