我有一个奇怪的问题:有时当我的显示器关闭时,风扇运转的声音很大,即使据我所知,系统上的 CPU 使用率不应该很高。
但是,一旦我移动鼠标并开始top
尝试诊断此问题,无论是什么活动,都会停止;随着风扇的停歇。
所以我想要一个脚本/程序/方法,我可以在某个时间点启动,让计算机在该程序记录进程的CPU活动时无人值守,然后当我恢复操作计算机时,我应该能够从中读取程序的报告我很快就会知道哪些过程让粉丝们努力工作。
编辑:一个chromium
进程在屏幕关闭时使风扇运转声音很大。但不知道为什么。
答案1
您可以每隔几秒钟运行一次“ps”,以及 loadavg 的基本转储,以简化搜索。将其保存为“psdump.sh”并使其可执行chmod +x psdump.sh
。
#!/bin/bash
while true; do
sleep 15
date
cat /proc/loadavg
ps Swaux | awk '$3!=0.0 {print}'
done
您可以从终端运行该脚本,以便将其保存到文件并进入后台:
/home/lserni/psdump.sh > /home/lserni/psdump.log
然后,就等着吧。该文件将显示类似以下内容:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 5.0 0.0 185412 5272 ? Ss Jan30 15340:14 /lib/systemd/systemd --system --deserialize 27
root 63 1.6 0.0 0 0 ? S Jan30 5042:59 [kswapd0]
root 1930 1.5 0.0 29008 2464 ? Ss Jan30 4816:50 /usr/sbin/cron -f
root 7446 0.1 0.0 3964564 60880 ? Sl Jan30 425:27 /opt/dell/srvadmin/sbin/dsm_om_connsvcd -run
mysql 7509 3.3 57.3 41322444 37757724 ? Ssl Aug17 599:39 /usr/sbin/mysqld
root 9634 17.1 4.9 6141588 3234672 ? Ssl Jan30 52154:34 /usr/local/bin/antani
日志文件将仅报告 CPU 百分比非零的进程(包括子进程)。您感兴趣的列可能是 %CPU 和累积时间(第 3 列和第 10 列)。
答案2
这应该可以做到:
Top 有一个“批处理”模式,用于通过-b
.所以这个脚本每 10 秒记录一次顶部输出:
#! /bin/sh
set -u
recording=/tmp/top_recording.txt
top_interval_seconds=10
top -b -d "$top_interval_seconds" > "$recording"
遗憾的是,除了前几个进程/任务之外的所有进程/任务都是多余的,因此我使用 Tr 和 Sed 查看报告,只留下 Top 生成的每个快照的前三个进程:
#! /bin/sh
set -u
recording=/tmp/top_recording.txt
regexp_first_few_lines='top'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'\
'[^\x00]*\x00'
export LC_ALL=C
< "$recording" \
tr '\n' '\0' | \
sed -E -e 's/\x00top/\ntop/g' | \
sed -E -e 's/^('"$regexp_first_few_lines"')(.|\x00)*$/\1/' | \
tr '\0' '\n' | \
less
要在 Less 中查找高 CPU 活动进程,请使用:
/[0-9] [A-Za-z] ([^ ]| [^ ]| [987])