首页 > 解决方案 > 在 bash 命令中为每个 pod 删除添加睡眠时间

问题描述

我有以下 bash 命令:

oc get pods -o wide \
    | grep -v asm \
    | grep -v fnd \
    | grep -v key \
    | grep -v apiwg \
    | grep -v cbkc \
    | grep -v container \
    | grep -v apigw \
    | grep -v apacheds \
    | grep -v couchbase-service \
    | grep -v catalogone-tool-job \
    | grep -v connector \
    | grep -v operator \
    | grep -v broker \
    | grep -v logicaldate \
    | grep -v oc-audit \
    | grep -v oc-cb-01-000 \
    | grep -v light-tracer \
    | grep -v rule-engine \
    | awk '{print $1}' \
    | grep -v NAME \
    | xargs oc delete pod --force --grace-period=0

我正在尝试为每个 pod 删除 ( xargs oc delete pod) 触发睡眠计时器,我有什么选择?

标签: bash

解决方案


xargs如果要一个一个删除, 我认为不是合适的工具。xargs旨在批量处理参数。如果oc delete pod ...一个接一个地执行是可以接受的,你可以通过 -n 1,但是你也可以使用一个 for 循环。最重要的是,你有很多不必要的 grep 调用。我会做这样的事情:

declare -a PODS=$(
  oc get pods -o wide | grep -v \
    -e asm \
    -e fnd \
    -e key \
    -e apiwg \
    -e cbkc \
    -e container \
    -e apigw \
    -e apacheds \
    -e couchbase-service \
    -e catalogone-tool-job \
    -e connector \
    -e operator \
    -e broker \
    -e logicaldate \
    -e oc-audit \
    -e oc-cb-01-000 \
    -e light-tracer \
    -e rule-engine | awk '{print $1}' | grep -v NAME
)

for i in "${PODS[@]}"; do
    oc delete pod --force --grace-period=0 "$i"
    sleep 10
done

编辑:由于 OP 要求它是一个命令;您可以PODS使用顶部的命令替换数组,如下所示:

for i in "$(oc get pods -o wide | ... )"; do
    oc delete pod --force --grace-period=0 "$i";
    sleep 10;
done

您也可以交互地使用 for 循环,没有限制,您只需添加分号来表示命令的结尾,然后在一行中键入所有内容。注意引用的子shell:"$(...)". 保持这一点很重要,以防您的容器名称中有空格(感谢@RenaudPacalet 的改进)。


推荐阅读