我想知道Linux上单个进程的CPU和内存使用情况——我知道PID。希望我每秒钟都能得到它,并使用'watch'命令将其写入CSV。我可以使用什么命令从Linux命令行中获得这些信息?
当前回答
ps axo pid,etime,%cpu,%mem,cmd | grep 'processname' | grep -v grep
PID -进程号
etime -进程运行/活时长
%cpu - cpu使用率
%mem -内存使用率
cmd -命令
将processname替换为任何你想跟踪的进程,mysql nginx php-fpm等等…
其他回答
启动一个程序并监控它
如果你想轻松地对可执行文件进行基准测试,这个表单是有用的:
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上测试。
(如果你使用的是MacOS 10.10,试试top的cumulative -c选项:
top -c a -pid PID
(此选项在其他linux中不可用,尝试使用Scientific linux el6和RHEL6)
ps axo pid,etime,%cpu,%mem,cmd | grep 'processname' | grep -v grep
PID -进程号
etime -进程运行/活时长
%cpu - cpu使用率
%mem -内存使用率
cmd -命令
将processname替换为任何你想跟踪的进程,mysql nginx php-fpm等等…
要获得应用程序的内存使用情况(而不是它使用的共享库),需要使用Linux smaps接口。这个答案很好地解释了这一点。
Ps命令(不应使用):
CPU使用率目前表示为进程整个生命周期中运行所花费时间的百分比。
最高命令(应使用):
自上次屏幕更新以来,任务占用CPU时间的份额,表示为总CPU时间的百分比。
使用top实时获取CPU使用情况(当前短间隔):
Top -b -n 2 -d 0.2 -p 6962 | tail -1 | awk '{打印$9}'
会像这样回响:78.6
- b:批处理模式 -n 2:迭代次数,使用2是因为:当你第一次运行它时,它没有前值 样本进行比较,因此这些初始值是启动后的百分比。 -d 0.2:延时时间(单位:秒,这里是200ms) -p 6962: monitor - pid 尾部-1:最后一行 Awk '{print $9}':第9列(CPU使用率)
推荐文章
- 如何首次配置postgresql ?
- 检索Linux上单个进程的CPU使用情况和内存使用情况?
- 如何从远程SSH会话发送数据到本地剪贴板
- 我如何得到bash完成工作与别名?
- SSH端口转发~/。ssh /配置文件?
- 通过使用shell脚本替换文件名中的特定模式来重命名多个文件
- 在Linux中安装Java SDK后,我可以在哪里找到它?
- 如何将多个文件的内容追加到一个文件
- linux cat命令可以用来写入文本文件吗?
- 如何杀死僵尸进程
- 如何进入每个目录并执行命令?
- 如何通过脚本创建crontab
- 我可以在/etc/hosts中映射主机名*和端口*吗?
- Tar归档,从文件列表中获取输入
- 寻找不属于特定用户的文件