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

如何追踪Bash脚本派生的子进程并优化kubectl端口转发脚本

优化后完整脚本
#!/bin/bash
set -uo pipefail

# 存储本次启动的kubectl进程PID
KUBECTL_PID=""
# 端口转发监听端口
FORWARD_PORT=2828
# 最长等待端口建立时间(秒)
MAX_WAIT=20

# 清理逻辑:脚本退出时杀死本次启动的kubectl进程
cleanup() {
    if [[ -n "$KUBECTL_PID" ]] && kill -0 "$KUBECTL_PID" 2>/dev/null; then
        kill "$KUBECTL_PID"
        echo "已终止本次启动的kubectl端口转发进程(PID: $KUBECTL_PID)"
    fi
}

# 绑定退出、Ctrl+C、终止信号到清理逻辑
trap cleanup EXIT SIGINT SIGTERM

# 启动端口转发后台进程
kubectl port-forward deployment/my ${FORWARD_PORT}:${FORWARD_PORT} -n myns &
KUBECTL_PID=$!

# 等待端口转发建立
echo "等待端口${FORWARD_PORT}转发建立..."
WAIT_COUNT=0
while ! nc -z 127.0.0.1 "${FORWARD_PORT}" >/dev/null 2>&1; do
    # 检查kubectl进程是否已经异常退出
    if ! kill -0 "$KUBECTL_PID" 2>/dev/null; then
        wait "$KUBECTL_PID"
        EXIT_CODE=$?
        echo "kubectl端口转发进程异常退出,退出码:${EXIT_CODE}"
        exit $EXIT_CODE
    fi
    # 超时判断
    if [[ $WAIT_COUNT -ge $MAX_WAIT ]]; then
        echo "等待端口转发建立超时(最大等待${MAX_WAIT}秒)"
        exit 1
    fi
    sleep 1
    WAIT_COUNT=$((WAIT_COUNT+1))
done

echo "端口转发已建立,开始执行后续任务"
# 此处添加你后续要执行的telepresence等其他任务逻辑
# ---------------------------
# 示例:打印端口连通性验证结果
nc -zv 127.0.0.1 ${FORWARD_PORT}
# ---------------------------
优化点说明
  • 解决误杀所有kubectl进程问题:通过$!获取本次启动的kubectl后台进程专属PID,清理时仅针对该PID操作,不会影响系统中其他用户运行的kubectl任务
  • 解决信号与进程回收问题:通过trap绑定退出、Ctrl+C、进程终止三类信号,脚本无论正常结束还是被手动中断,都会自动清理本次启动的kubectl端口转发进程,避免残留孤儿进程
  • 解决固定休眠等待过久问题:使用端口连通性检测替代固定休眠,端口转发建立成功后立即进入后续逻辑,无需等待固定时长,最大等待时间可通过MAX_WAIT变量自定义调整
  • 解决kubectl错误未处理问题:端口检测过程中会持续检查kubectl进程状态,若进程提前异常退出会直接抛出错误终止脚本;端口建立超时也会主动退出,避免后续任务依赖无效的端口转发执行

若你的系统中没有nc命令,可将端口检测逻辑替换为ss -tulpn | grep -q ":${FORWARD_PORT} " >/dev/null 2>&1,效果一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:18:02