我想知道Linux上单个进程的CPU和内存使用情况——我知道PID。希望我每秒钟都能得到它,并使用'watch'命令将其写入CSV。我可以使用什么命令从Linux命令行中获得这些信息?
当前回答
对于那些纠结了一段时间,想知道为什么选定的答案不管用的人:
ps -p <pid> -o %cpu,%mem
%cpu和%mem之间没有空格。
其他回答
启动一个程序并监控它
如果你想轻松地对可执行文件进行基准测试,这个表单是有用的:
topp() (
if [ -n "$O" ]; then
$* &
else
$* &>/dev/null &
fi
pid="$!"
trap "kill $pid" SIGINT
o='%cpu,%mem,vsz,rss'
printf '%s\n' "$o"
i=0
while s="$(ps --no-headers -o "$o" -p "$pid")"; do
printf "$i $s\n"
i=$(($i + 1))
sleep "${T:-0.1}"
done
)
用法:
topp ./myprog arg1 arg2
样例输出:
%cpu,%mem,vsz
0 0.0 0.0 177584
1 0.0 0.1 588024
2 0.0 0.1 607084
3 0.0 0.2 637248
4 0.0 0.2 641692
5 68.0 0.2 637904
6 80.0 0.2 642832
其中vsz是KiB的总内存使用量,例如,上面的mib使用量约为600MiB。
如果程序完成,循环停止,我们退出topp。
或者,如果你git Ctrl + C,程序也会因为陷阱而停止:当我的shell脚本退出时,我如何杀死后台进程/作业?
选项是:
T=0.5 topp ./myprog:更改轮询间隔 O=1 topp ./myprog:不隐藏程序stdout/stderr。这对于帮助关联内存使用爆发与stdout的时间点非常有用。
ps vs top瞬时CPU%使用率
注意,上面ps给出的CPU使用率不是“瞬时的”(即在最后N秒内),而是进程整个生命周期的平均值,如https://unix.stackexchange.com/questions/58539/top-and-ps-not-showing-the-same-cpu-result所述,ps内存测量应该是好的。
该线程以及:如何从shell中确定当前的CPU利用率?建议Linux内核不存储任何更多的中间使用统计数据,所以唯一的方法是轮询和计算前一段时间,这是top所做的。
因此,如果我们想要,我们可以用top -n1代替ps:
toppp() (
$* &>/dev/null &
pid="$!"
trap exit SIGINT
i=1
top -b n1 -d "${T:-0.1}" -n1 -p "$pid"
while true; do top -b n1 -d "${T:-0.1}" -n1 -p "$pid" | tail -1; printf "$i "; i=$(($i + 1)); done
)
如前所述,例如在:https://stackoverflow.com/a/62421136/895245,它产生类型为:
top - 17:36:59 up 9:25, 12 users, load average: 0.32, 1.75, 2.21
Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 13.4 us, 2.5 sy, 0.0 ni, 84.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 31893.7 total, 13904.3 free, 15139.8 used, 2849.7 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 16005.5 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
706287 ciro 20 0 590436 40352 20568 R 106.7 0.1 0:00.16 node
706287 ciro 20 0 607060 57172 21340 R 126.7 0.2 0:00.35 node
1 706287 ciro 20 0 642008 80276 21812 R 113.3 0.2 0:00.52 node
2 706287 ciro 20 0 641676 93108 21812 R 113.3 0.3 0:00.70 node
3 706287 ciro 20 0 647892 99956 21812 R 106.7 0.3 0:00.87 node
4 706287 ciro 20 0 655980 109564 21812 R 140.0 0.3 0:01.09 node
一些相关的话题:
如何只运行一次top (-b -n1) https://askubuntu.com/questions/484510/how-to-run-top-command-1-time-and-exit https://unix.stackexchange.com/questions/60328/how-to-stream-top-snapshot-into-file询问关于 如何从顶部删除头文件:没有人有更好的解决方案,所以我们只是跟踪它: https://unix.stackexchange.com/questions/471072/how-to-remove-top-commands-header 如何压制高层的一般信息
我唯一的问题是顶部不太适合交互使用:
Ctrl + C不退出上面的命令,不确定为什么陷阱退出不像ps那样工作。我必须杀死Ctrl + \命令,然后这不会杀死继续在后台运行的进程本身,这意味着如果它是一个像服务器一样的无限循环,我必须ps aux,然后杀死它。 当基准测试程序退出时,not自动退出
也许比我更懂外壳的人能找到解决办法。
Ps内存测量应该与top相同,但如果你只是在内存之后。
相关:
检索Linux上单个进程的CPU使用情况和内存使用情况? https://unix.stackexchange.com/questions/554/how-to-monitor-cpu-memory-usage-of-a-single-process
在Ubuntu 21.10上测试。
这是一个很好的技巧,可以实时跟踪一个或多个程序,同时还可以查看其他工具的输出: 看"top -bn1 -p$(pidof foo),$(pidof bar);工具”
ps -p <pid> -o %cpu,%mem,cmd
(您可以省略“cmd”,但这可能有助于调试)。
注意,这给出了进程在运行期间的平均CPU使用率。
你可以使用top -b和grep输出你想要的pid(带-b标志的top在批处理模式下运行),或者也可以使用-p标志并指定pid而不使用grep。
ps aux|awk '{print $2,$3,$4}'|grep PID
其中第一列是PID,第二列是CPU使用率,第三列是内存使用率。
推荐文章
- 如何首次配置postgresql ?
- 检索Linux上单个进程的CPU使用情况和内存使用情况?
- 如何从远程SSH会话发送数据到本地剪贴板
- 我如何得到bash完成工作与别名?
- SSH端口转发~/。ssh /配置文件?
- 通过使用shell脚本替换文件名中的特定模式来重命名多个文件
- 在Linux中安装Java SDK后,我可以在哪里找到它?
- 如何将多个文件的内容追加到一个文件
- linux cat命令可以用来写入文本文件吗?
- 如何杀死僵尸进程
- 如何进入每个目录并执行命令?
- 如何通过脚本创建crontab
- 我可以在/etc/hosts中映射主机名*和端口*吗?
- Tar归档,从文件列表中获取输入
- 寻找不属于特定用户的文件