如何在 bash / 替换文本 / CPU 用法中使函数在后台工作

How to make a function work in background in bash / replace text / CPU usage

我一直在研究 bashrc,我一直想看到的一件事是我的 cpu 使用百分比。我决定在我的 PS1 中设置此数据。问题是要准确估计我的 CPU 使用情况,我需要执行至少需要等待 0.5 秒的操作。

这样一来,我的新命令行只显示在CPU计算结束,0.5秒后,这实在是不能接受。为了解决这个问题,我认为我可以使用一个线程来进行 CPU 计算,并且只在最后显示它,但我不知道该怎么做。

其中一个问题是我在 CPU 百分比之后显示其他信息,所以我不知道是否有可能延迟 CPU 显示同时仍然显示命令的其余部分线。我想也许我可以显示一个临时字符串,例如 ??.??,然后用实际值替换它,但我不确定该怎么做,因为如果我快速键入命令,??.?? 的位置可以变化(例如非常快地连续输入 ls 5 次)。

也许有更简单的方法可以解决我的问题,例如以其他方式计算 CPU 百分比?

我的CPU百分比计算函数:

function cpuf(){
    NonIdle=0;Idle=0;Total=0;TotalD=0;Idled=0
    NonIdle=$((`cat /proc/stat | awk '/^cpu / {print+++++}'` - $NonIdle))
    Idle=$((`cat /proc/stat | awk '/^cpu / {print+}'` - $Idle))
    sleep 0.5
    NonIdle=$((`cat /proc/stat | awk '/^cpu / {print+++++}'` - $NonIdle))
    Idle=$((`cat /proc/stat | awk '/^cpu / {print+}'` - $Idle))
    Total=$((Idle+NonIdle))
    CPU=$(((Total-Idle)/Total))
    echo `echo "scale=2;($Total*100-$Idle*100)/$Total" | bc -l`
}

我如何在 bashrc 中调用它:

alias cpu="cpuf"
PS1+="(\[${MAGENTA}\]CPU $(cpu)%"

这里不需要重新发明轮子,linux 已经在 /proc/loadavg 中负责捕获系统统计信息。第一个数字是所有 cpu 在最后一分钟的平均负载,所以我们只需要除以 cpu 的数量,我们可以通过读取 /proc/cpuinfo 来确定。将其滚动到 .bashrc 我们得到:

.bashrc

...
# My fancy prompt, adjust as you like...
FANCY_PROMPT="$GREEN\u$YELLOW@\h:$PURPLE\w$BLUE$ $RESET"

CPUS=$( grep -c bogomips /proc/cpuinfo )

_prompt_command() {
    LOAD_AVG_1_MIN=$( cut -d ' ' -f 1 /proc/loadavg )
    PERCENT=$( echo "scale=0; $LOAD_AVG_1_MIN * 100 / $CPUS" | bc -l )
    PS1="CPU $PERCENT% $FANCY_PROMPT"
    true
}

PROMPT_COMMAND="_prompt_command"

正在使用:

SO linux /proc/loadavg