Ubuntu服务器部署时Bamboo Shell脚本执行卡住问题排查
Bamboo部署在Ubuntu服务器一直显示“部署中”但实际任务已完成的排查与解决
问题场景
我们通过Shell脚本完成代码仓库更新、部署及应用重启操作,此前在普通Linux服务器上运行正常。迁移至Ubuntu服务器后,主机端部署任务已完成、应用成功重启且日志正常更新,但Bamboo部署页面始终显示“部署中”,该问题仅在Ubuntu环境出现。
执行的部署脚本如下:
#!/usr/bin/bash set -e USER="app" LOG_DIR="/logs/$USER" cd /my/dir/groupctl echo "---------------------------------" >> $LOG_DIR/bamboo.log date >> $LOG_DIR/bambool.log echo "Starting ${bamboo.REPO_NAME} apps" >> $LOG_DIR/bambool.log ./apps --restart >> $LOG_DIR/bambool.log echo "Restart completed for ${bamboo.REPO_NAME}" >> $LOG_DIR/bambool.log echo "" >> $LOG_DIR/bambool.log echo "Status ${bamboo.REPO_NAME} apps" >> $LOG_DIR/bambool.log ./apps --status >> $LOG_DIR/bambool.log
问题排查与修复方案
1. 日志文件拼写错误
脚本中多次将目标日志文件bamboo.log误写为bambool.log(多了一个字母l)。虽然当前日志正常更新,但该错误可能导致后续排查混乱,且若LOG_DIR权限不足,可能触发set -e的退出逻辑,让Bamboo误判任务未完成。
2. Shebang路径兼容性问题
Ubuntu系统中,bash的默认路径为/bin/bash,而脚本中使用的#!/usr/bin/bash在部分Ubuntu环境下可能不存在,导致系统用默认shell执行脚本,引发行为差异。建议改为兼容写法:
#!/bin/bash # 或更通用的写法 #!/usr/bin/env bash
3. 缺少显式退出状态码
Bamboo通过脚本的退出码判断任务是否完成,若脚本未明确返回成功状态码(0),可能导致Bamboo持续显示“部署中”。需在脚本末尾添加exit 0。
4. 命令错误未捕获与日志不完整
原脚本仅重定向标准输出,未捕获错误输出,且未对关键命令的执行结果做检查。建议添加错误捕获逻辑,并将错误输出同步写入日志,方便排查问题。
修正后的脚本
#!/bin/bash USER="app" LOG_DIR="/logs/$USER" # 确保日志目录存在,避免写入失败 mkdir -p "$LOG_DIR" # 切换目录失败时直接退出并记录错误 cd /my/dir/groupctl || { echo "Failed to enter directory: /my/dir/groupctl" >> "$LOG_DIR/bamboo.log"; exit 1; } echo "---------------------------------" >> "$LOG_DIR/bamboo.log" date >> "$LOG_DIR/bamboo.log" echo "Starting ${bamboo.REPO_NAME} apps" >> "$LOG_DIR/bamboo.log" # 捕获重启命令的错误输出,失败时记录并退出 ./apps --restart >> "$LOG_DIR/bamboo.log" 2>&1 || { echo "Restart failed for ${bamboo.REPO_NAME}" >> "$LOG_DIR/bamboo.log"; exit 1; } echo "Restart completed for ${bamboo.REPO_NAME}" >> "$LOG_DIR/bamboo.log" echo "" >> "$LOG_DIR/bamboo.log" echo "Status ${bamboo.REPO_NAME} apps" >> "$LOG_DIR/bamboo.log" # 捕获状态检查命令的错误输出 ./apps --status >> "$LOG_DIR/bamboo.log" 2>&1 || { echo "Status check failed for ${bamboo.REPO_NAME}" >> "$LOG_DIR/bamboo.log"; exit 1; } # 显式返回成功状态码 exit 0
额外验证步骤
- 在Ubuntu服务器上手动执行脚本,观察是否能正常结束,执行
echo $?查看退出码是否为0 - 检查
./apps --restart和./apps --status命令在Ubuntu下是否会正常退出,无后台挂起或终端交互需求
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

