【问题标题】:Shell script: top command and date command at onceShell 脚本:同时使用 top 命令和 date 命令
【发布时间】:2016-10-11 15:48:36
【问题描述】:

我想在文件中打印一个进程的cpu使用百分比(top命令)+此top命令获取信息的日期,每0.5秒(每行带有日期+此cpu信息) 如果我用 shell 脚本编写,我会做类似的事情

while [ ! -f $STOP_FILE ]
do
echo "$(date +%s.%N)" >> $REPORT_FILE
top -b -n 1 -p myProcessPID | grep myProcessName | awk -F " " '{print $12 "\t" $9}' >> result.txt
sleep 0.5
done

但是我不能使用顶部的 -n 1 选项来获取 cpu 信息,因为第一次迭代是 "from system boot until now" 所以我需要其他迭代。

因此,我正在寻找一些命令组合,以使用 top 命令 + 纳秒日期 (date +%s.%N) 获取进程信息(top 命令也会在标题的第一行产生时间,但我想要毫秒)

我正在尝试类似的东西,

echo $(date +%s.%N) $(top -d 0.5 -n 100 -p myProcessPID | grep myProcessName) >> results.txt

但日期仅在第一次迭代时打印。

有什么想法吗?

对不起,如果我的问题不是很准确,我是这个脚本的新手,在这里写..

【问题讨论】:

  • 如果你让top内部执行迭代,在单次运行的过程中,那么当然date也只有一次运行。
  • 除非您有特定原因,否则不要重新发明轮子 - 使用例如dstat.
  • 作为 moreutils 一部分的时间戳输入 ts 实用程序可以很好地解决这个问题。

标签: bash shell scripting centos7 top-command


【解决方案1】:

您可以通过管道将top 的输出传递到awk,并让awk 运行date。例如:

top -d 0.5 -n 100 -p myProcessPID \
   | awk '/myProcessName/ { system("date +%s"); print $0 }'

您可以通过调整awk 程序对输出格式进行任意控制。另请注意,您不需要单独的grep,因为awk 的内部模式匹配非常好。

【讨论】:

  • 这正是我想要的,谢谢!感谢您的快速回复。
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
相关资源
最近更新 更多