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
相关产品推荐
相关产品推荐

