CodeDeploy报错:脚本未关闭STDERR,如何正确输出到nohup.out?
问题描述
执行CodeDeploy部署脚本时触发如下错误:
InstanceAgent::Plugins::CodeDeployPlugin::HookExecutor: Script at specified location: scripts/powwow-deploy.sh failed to close STDERR
Script at specified location: scripts/powwow-deploy.sh failed to close STDERR
涉及的部署脚本powwow-deploy.sh内容如下:
nohup java -jar -Dspring.profiles.active=uat target/pow-wow-0.0.2-SNAPSHOT.jar > logs/nohup.out &
推测问题出在输出重定向> logs/nohup.out操作上,需要调整脚本实现输出写入目标文件且不触发该错误。
解决方案
错误根源是脚本未正确处理STDERR(标准错误输出),CodeDeploy Agent要求执行的脚本必须正确关闭所有打开的文件描述符,包括STDERR。
修改后的脚本写法:
nohup java -jar -Dspring.profiles.active=uat target/pow-wow-0.0.2-SNAPSHOT.jar > logs/nohup.out 2>&1 &
如果需要更严谨地满足CodeDeploy的要求,可以同时关闭标准输入:
nohup java -jar -Dspring.profiles.active=uat target/pow-wow-0.0.2-SNAPSHOT.jar > logs/nohup.out 2>&1 < /dev/null &
关键说明:
2>&1:将STDERR(文件描述符2)重定向到STDOUT(文件描述符1)的输出目标,让错误信息和正常输出一起写入logs/nohup.out,同时关闭了独立的STDERR流。< /dev/null:将标准输入重定向到空设备,避免进程等待输入的同时,显式关闭STDIN,完全符合CodeDeploy对脚本文件描述符的处理要求。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

