Linux
以非互動方式辨識佔用大量 CPU 時間的程序
我有一個奇怪的問題:有時當我的顯示器關閉時,風扇運轉得很響,據我所知,即使系統上的 CPU 使用率不高。
但是,只要我移動滑鼠並開始
top
嘗試對此進行診斷,該活動(無論它是什麼)都會停止;隨著風扇的關閉。所以我想要一個可以在某個時間點啟動的腳本/程序/方法,在該程序記錄程序的 CPU 活動時讓電腦無人看管,然後當我恢復操作電腦時,我應該能夠從我很快就會知道是什麼過程讓粉絲們努力工作。
編輯:一個
chromium
過程是在螢幕關閉時讓風扇大聲運轉的過程。不過不知道為什麼。
這應該這樣做:
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])
您可以每隔幾秒鐘執行一次“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 列)。