我正在运行一个进程,我想存储它的 CPU 使用率。
所以我使用了 top 命令
{ test_case.sh > out.log ; } && { sleep 2s ; x=`pidof test_case` ; top -p $x -d 5 -b > cpu.log ; }
但是 cpu.log 文件是空的,而 out.log 包含 test_case 的输出
我不知道为什么。
你能帮我获取 top 命令的输出直到该过程完成吗
答案1
{ ./can.sh > canny.log & x=$(pidof -s /bin/bash ./can.sh) ; echo > cpu.log ; } && { while test $x == $(pidof -s /bin/bash ./can.sh) ; do top -p $x -bn 1 >> cpu.log ; sleep 5s ; done ; }
can.sh 是我的流程。can.sh 的第一行是 sleep 1s,这是为了确保 $x 建立。
编辑... 看完这个之后,这个采用了你的设计并使其无错误地执行.... 但实际上它并没有达到你的预期... 你的 test.sh(我的 can.sh)是一个执行命令的脚本... 脚本不使用 CPU... 它们执行的命令将使用 CPU... 所以你不会看到这种方法反映这一点。 我将把它留在那里,以防你能弄清楚如何让 top 给你调用的命令的 CPU 使用率。
... pidstat 本来会更好...但仍然会出现同样的问题。我不会使用脚本来举例...只是一个命令。
:~$ pidstat 1 -e dd if=/dev/zero of=/home/thecarebears/pinecone.txt bs=1024 count=1000000
Linux 5.4.0-51-generic () 10/30/2020 _x86_64_ (2 CPU)
07:51:54 PM UID PID %usr %system %guest %wait %CPU CPU Command
07:51:55 PM 1000 237570 9.00 90.00 0.00 0.00 99.00 1 dd
07:51:56 PM 1000 237570 8.00 91.00 0.00 0.00 99.00 1 dd
07:51:57 PM 1000 237570 0.00 11.00 0.00 0.00 11.00 1 dd
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB, 977 MiB) copied, 3.81999 s, 268 MB/s
Average: 1000 237570 5.67 64.00 0.00 0.00 69.67 - dd
显示 CPU 统计信息,在本例中每 1 秒显示一次,直到指定的命令完成...该命令是 dd(带有参数),但如果我在 can.sh 中运行 dd,pidstat 1 -e can.sh
将显示 0% CPU,因为 dd 是脚本正在执行的命令...我不知道让脚本作为命令出现在操作系统中的魔力(如果它存在)...
因此,如果您有一个想要监控的命令,而不是脚本,那么这两者都可以起作用...如果您无法解决这个问题,那么您可能需要做更多的计算...除非其他人提供一些额外的知识。