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

Jenkins中多后台执行WebLogic启停Bash脚本卡住问题求助

Jenkins中WebLogic多服务器启停脚本卡住问题解决

问题场景

现有用于启停WebLogic受管服务器的Bash脚本如下:

#!/bin/bash

function start() {
    $WL_HOME/common/bin/wlst.sh <<EOF
      connect("$username","$password","$URL_ADMIN_SERVER")
      start($1,"Server")
EOF
}

function stop() {
    $WL_HOME/common/bin/wlst.sh <<EOF
      connect("$username","$password","$URL_ADMIN_SERVER")
      shutdown($1,"Server", ignoreSessions='true', force='true')
EOF
}

if [[ $mode == "start" ]]; then
    for server in ${servers%"--"}; do
        echo "<start-stop-server> *************** Start $server managed server ***************"
        start "$server" &
    done
elif [[ $mode == "stop" ]]; then
    for server in ${servers%"--"}; do
        echo "<start-stop-server> *************** Stop $server managed server ***************"
        stop "$server" &
    done
fi

在Jenkins中传入多个服务器参数时,脚本通过循环后台调用start/stop函数(使用&)会出现卡住现象;但传入单个参数,或在服务器上手动执行多参数(2个及以上)时,脚本运行完全正常。

解决方法

1. 重定向后台进程的IO流

Jenkins的执行环境中,后台进程的标准输入、输出或错误流如果未正确处理,可能因缓冲区阻塞或等待输入导致卡住。修改函数调用命令,将所有IO流重定向到日志文件或/dev/null:

# 启动服务器时的修改
start "$server" > /tmp/weblogic_start_${server}.log 2>&1 &

# 停止服务器时的修改
stop "$server" > /tmp/weblogic_stop_${server}.log 2>&1 &

此操作既可以避免IO阻塞,还能保留日志方便后续排查问题。

2. 等待所有后台进程完成

原脚本启动后台进程后未等待执行完毕就直接结束,Jenkins无法正确识别任务的结束状态,进而引发卡住问题。在循环结束后添加wait命令,让脚本等待所有后台进程完成后再退出:

if [[ $mode == "start" ]]; then
    for server in ${servers%"--"}; do
        echo "<start-stop-server> *************** Start $server managed server ***************"
        start "$server" > /tmp/weblogic_start_${server}.log 2>&1 &
    done
    # 等待所有启动进程执行完成
    wait
elif [[ $mode == "stop" ]]; then
    for server in ${servers%"--"}; do
        echo "<start-stop-server> *************** Stop $server managed server ***************"
        stop "$server" > /tmp/weblogic_stop_${server}.log 2>&1 &
    done
    # 等待所有停止进程执行完成
    wait
fi

3. 优化服务器参数解析(可选)

原脚本中${servers%"--"}的处理方式存在格式兼容隐患,若参数格式变化容易出错。可改为更可靠的遍历逻辑,跳过无效标记:

for server in $servers; do
    # 跳过末尾的--标记
    if [[ $server == "--" ]]; then
        continue
    fi
    # 原有启停逻辑保持不变
done

内容的提问来源于stack exchange,提问作者Edson Martins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:20:30