【问题标题】:Using for loop in bash script在 bash 脚本中使用 for 循环
【发布时间】:2017-05-30 07:29:44
【问题描述】:

我在 shell bash 中有这个脚本:

top | awk '{$10 $11}'> agent.csv
top | awk '{$10 $11}'> spark.csv
top | awk '{$10 $11}'> kafka.csv
top | awk '{$10 $11}'> zk.csv
top | awk '{$10 $11}'> engine.csv

for ((;;))
do
        top -b -c -d 2 n 10 | grep agent >> agent.csv;
        top -b -c -d 2 n 10 | grep spark >> spark.csv
        top -b -c -d 2 n 10 | grep kafka >> kafka.csv
        top -b -c -d 2 n 10 | grep zookeeper >> zk.csv
        top -b -c -d 2 n 10 | grep engine >> engine.csv
        sleep 10;
done &

我在循环之前尝试使用“awk”命令执行的操作是获取指标 %CPU 和 %MEM 的名称。 在循环内我试图获得特定的进程 然后将它们放在一个文件中,每个文件为每个进程

我没有得到我想要得到的东西。 没有任何东西被写入文件。

【问题讨论】:

  • 我不明白你想用第一个顶部实现什么。您将拥有顶部的所有第 10 列和第 11 列,以及标题(僵尸、平均负载等)。此外,您的 awk 命令不会打印任何内容,因此您不会有任何结果,它应该类似于:awk '{print $10" "$11}'
  • 如果你想要实现的是在你的文件中有一个对应于顶级命令之一的标题,你应该尝试类似:top -b -n 1 |grep "PID USER" |tee agent.csv spark.csv kafka.csv zk.csv engine.csv

标签: linux bash shell for-loop


【解决方案1】:

top 无休止地运行。如果您只想运行一次,请使用选项-n 指定迭代次数,就像您在 for 循环中已经完成的那样。此外,使用选项 -b 启用批处理模式也很有用:top -b -n 1

请注意,单次迭代不会返回所有进程的当前 CPU 使用率,而是返回自它们启动以来的平均 CPU 使用率。

【讨论】:

    【解决方案2】:

    您可以使用以下命令:

    顶部-n 1 | grep -e CPU -e 内存 | awk '{print $10" "$11}' > agent.csv

    top -n 1 只打印 1 个顶部输出,而不是每 1 秒定期刷新一次(默认)。

    grep 在输出的 ROW 中搜索 2 个模式 CPU 和 MEM(使用 -e 选项完成多个表达式搜索)。当找到它时,也就是顶部输出的第 0 行,它作为输入传递给 awk 语句。

    awk 语句然后仅将 CPU 和 MEM 列打印到您的文件中。

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 2020-01-31
      • 2021-12-30
      • 2019-05-31
      相关资源
      最近更新 更多