使用AWS CodeDeploy部署Java版Discord Bot仅首次成功,二次部署失败求助
解决AWS CodeDeploy二次部署ApplicationStop脚本报错问题
问题现象
首次使用AWS CodeDeploy部署Java编写的Discord Bot成功,但二次部署时整体失败,事件日志显示ApplicationStop步骤执行stop_bot.sh脚本报错:
LifecycleEvent - ApplicationStop Script - stop_bot.sh [stderr]java: no process found
原因分析
当前stop_bot.sh使用killall -9 java命令,该命令在未匹配到Java进程时会返回非0退出码。而AWS CodeDeploy默认将脚本的非0退出码判定为步骤执行失败,直接终止整个部署流程。这种情况常见于Bot进程意外退出、实例重启后进程未运行等场景。
解决方案
方案1:让stop脚本忽略进程不存在的错误
修改stop_bot.sh,确保即使没有找到Java进程,脚本也返回0退出码:
killall -9 java 2>/dev/null || true
2>/dev/null:将killall的错误输出重定向到空设备,避免日志报错。|| true:如果killall执行失败,强制让脚本返回0,CodeDeploy会判定步骤执行成功。
方案2:精准杀死Bot进程(推荐)
直接杀死所有Java进程可能误杀其他服务,更安全的方式是记录Bot的PID,只终止目标进程:
- 修改
start_bot.sh,启动Bot时将进程ID写入PID文件:
nohup java -jar /tmp/DuoCord-0.1.jar dev.rifaii.Main > /dev/null 2>&1 < /dev/null & echo $! > /tmp/duocord_bot.pid
- 修改
stop_bot.sh,读取PID文件并终止对应进程:
if [ -f /tmp/duocord_bot.pid ]; then PID=$(cat /tmp/duocord_bot.pid) kill -9 $PID 2>/dev/null rm /tmp/duocord_bot.pid fi
此方法仅针对Bot进程操作,避免影响其他Java服务,且脚本不会因PID文件不存在或进程已结束而返回错误。
方案3:调整CodeDeploy部署组配置(不推荐)
在CodeDeploy控制台的部署组设置中,找到生命周期事件失败处理,将ApplicationStop步骤的失败行为改为“继续部署”。但这种方式会掩盖真实问题,可能导致旧进程残留,不建议作为长期解决方案。
内容的提问来源于stack exchange,提问作者dev-rifaii
相关产品推荐
相关产品推荐

