首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash命令中为每次pod删除添加睡眠时间

在bash命令中为每次pod删除添加睡眠时间
EN

Stack Overflow用户
提问于 2021-08-17 12:21:55
回答 3查看 111关注 0票数 0

我有以下bash命令:

代码语言:javascript
复制
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

我试图为每一个吊舱删除(xargs oc delete pod)触发一个睡眠定时器,我的选择是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-17 12:43:56

我不认为xargs是适当的工具,如果你想一个一个地删除。xargs被设计成分批处理参数。如果一个一个地执行oc delete pod ...是可以接受的,您可以传递-n 1,但是您也可以使用for循环。最重要的是,您有那么多不必要的调用grep。我会这样做:

代码语言:javascript
复制
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数组替换为顶部的命令,如下所示:

代码语言:javascript
复制
for i in "$(oc get pods -o wide | ... )"; do
    oc delete pod --force --grace-period=0 "$i";
    sleep 10;
done

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

票数 2
EN

Stack Overflow用户

发布于 2021-08-17 12:31:40

您可以在传递给xargs的命令中添加睡眠,例如,将其包装在sh -c ...中。

顺便说一句,这是一条可怕的输油管。您可以将grep -v foo | grep -v bar重构为grep -v -e foo -e bar,也可以将字符串保存在文件中并使用grep -v -f filename;但是,让我们进一步将所有内容重构到一个Awk脚本中。另见useless use of grep.

代码语言:javascript
复制
oc get pods -o wide |
awk '!/asm|fnd|key|apiwg|cbkc|container|apigw|apacheds|couchbase-service|catalogone-tool-job|connector|operator|broker|logicaldate|oc-audit|oc-cb-01-000|light-tracer|rule-engine/ && $1 !~ /NAME/ {
   print $1}' |
xargs sh -c 'for f; do
    oc delete pod --force --grace-period=0 "$f"
    sleep 1
done' _

Awk脚本可能会被进一步重构,以数组的形式传入字符串,但这也取决于这些字符串的确切来源。听起来,也许您应该添加一个标记或其他东西,这样您就可以向oc get pods中添加一个参数,以便只针对您想要的对象。

票数 1
EN

Stack Overflow用户

发布于 2021-08-17 12:40:02

只需正常循环-没有理由使用xargs。以下是另一张照片:

代码语言:javascript
复制
exclude=(
   asm
   fnd
   ...
)

oc get pods -o wide |
grep -v -f <(printf "%s\n" "${exclude[@]}") |
awk '{print $1}' |
grep -v NAME |
while IFS= read -r f; do
   oc delete pod --force --grace-period=0 "$f"
   sleep 1
done

当您将|放在行尾时,就不需要编写\了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68817294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档