如何在 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
我一直在研究 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