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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:45:36