You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,只终止目标进程:

  1. 修改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
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:55:09