From b275130b43b7a4c717ba60b2948a4e5cc2cc2437 Mon Sep 17 00:00:00 2001 From: James Date: Fri, 2 Mar 2018 00:11:07 +0800 Subject: [PATCH 01/19] Add sar and fix some system detect command wrong --- scripts/cpu_collect.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/cpu_collect.sh b/scripts/cpu_collect.sh index 768caba..d88de55 100755 --- a/scripts/cpu_collect.sh +++ b/scripts/cpu_collect.sh @@ -22,7 +22,10 @@ get_cpu_usage() { | sed -u -nr '/CPU usage/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)%[[:space:]]*idle.*/\1/p' \ | stdbuf -o0 awk '{ print 100-$0 }' fi - elif ! command_exists "vmstat"; then + elif [ ! `command_exists "sar"` -a is_linux ]; then + sar -u "$refresh_interval" "$samples_count" \ + | stdbuf -o0 awk 'NR>2 {print 100-$(8)}' + elif [ ! `command_exists "vmstat"` ]; then if is_freebsd; then vmstat -n "$refresh_interval" -c "$samples_count" \ | stdbuf -o0 awk 'NR>2 {print 100-$(NF-0)}' From cbcc1e2b68ea936e82d552da9b5493cd8bac638a Mon Sep 17 00:00:00 2001 From: lijin Date: Fri, 2 Mar 2018 09:16:31 +0800 Subject: [PATCH 02/19] fix sar with nice --- scripts/cpu_collect.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/cpu_collect.sh b/scripts/cpu_collect.sh index d88de55..e5d2fb8 100755 --- a/scripts/cpu_collect.sh +++ b/scripts/cpu_collect.sh @@ -23,8 +23,14 @@ get_cpu_usage() { | stdbuf -o0 awk '{ print 100-$0 }' fi elif [ ! `command_exists "sar"` -a is_linux ]; then - sar -u "$refresh_interval" "$samples_count" \ - | stdbuf -o0 awk 'NR>2 {print 100-$(8)}' + SAR_STAT=`sar -u 1 1 |grep nice` + if [[ "$SAR_STAT" == "" ]]; then + sar -u "$refresh_interval" "$samples_count" \ + | stdbuf -o0 awk '{print 100-$(9)}' + else + sar -u "$refresh_interval" "$samples_count" \ + | stdbuf -o0 awk '{print 100-$(8)}' + fi elif [ ! `command_exists "vmstat"` ]; then if is_freebsd; then vmstat -n "$refresh_interval" -c "$samples_count" \ From bb5248e6a85cea1bb901dd903a3db3d292406954 Mon Sep 17 00:00:00 2001 From: lijin Date: Fri, 2 Mar 2018 09:18:32 +0800 Subject: [PATCH 03/19] fix a mistake --- scripts/cpu_collect.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/cpu_collect.sh b/scripts/cpu_collect.sh index e5d2fb8..945c1e0 100755 --- a/scripts/cpu_collect.sh +++ b/scripts/cpu_collect.sh @@ -26,10 +26,10 @@ get_cpu_usage() { SAR_STAT=`sar -u 1 1 |grep nice` if [[ "$SAR_STAT" == "" ]]; then sar -u "$refresh_interval" "$samples_count" \ - | stdbuf -o0 awk '{print 100-$(9)}' + | stdbuf -o0 awk '{print 100-$(8)}' else sar -u "$refresh_interval" "$samples_count" \ - | stdbuf -o0 awk '{print 100-$(8)}' + | stdbuf -o0 awk '{print 100-$(9)}' fi elif [ ! `command_exists "vmstat"` ]; then if is_freebsd; then From dc8fbcea773096f455f488f1e54aa14c9a84ee9f Mon Sep 17 00:00:00 2001 From: James Date: Mon, 5 Mar 2018 00:32:48 +0800 Subject: [PATCH 04/19] fix idle line number --- scripts/cpu_collect.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/cpu_collect.sh b/scripts/cpu_collect.sh index 945c1e0..226a7dc 100755 --- a/scripts/cpu_collect.sh +++ b/scripts/cpu_collect.sh @@ -23,13 +23,13 @@ get_cpu_usage() { | stdbuf -o0 awk '{ print 100-$0 }' fi elif [ ! `command_exists "sar"` -a is_linux ]; then - SAR_STAT=`sar -u 1 1 |grep nice` + SAR_STAT=`sar -u 1 1|awk '{ print $8}'|grep idle` if [[ "$SAR_STAT" == "" ]]; then sar -u "$refresh_interval" "$samples_count" \ - | stdbuf -o0 awk '{print 100-$(8)}' + | stdbuf -o0 awk '{print 100-$(9)}' else sar -u "$refresh_interval" "$samples_count" \ - | stdbuf -o0 awk '{print 100-$(9)}' + | stdbuf -o0 awk '{print 100-$(8)}' fi elif [ ! `command_exists "vmstat"` ]; then if is_freebsd; then From a1ad2bbb4ad832879aedd2d55102e9eeda1c82de Mon Sep 17 00:00:00 2001 From: James Date: Mon, 5 Mar 2018 00:51:48 +0800 Subject: [PATCH 05/19] fix 100% error --- scripts/cpu_collect.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/cpu_collect.sh b/scripts/cpu_collect.sh index 226a7dc..4edffaa 100755 --- a/scripts/cpu_collect.sh +++ b/scripts/cpu_collect.sh @@ -26,10 +26,10 @@ get_cpu_usage() { SAR_STAT=`sar -u 1 1|awk '{ print $8}'|grep idle` if [[ "$SAR_STAT" == "" ]]; then sar -u "$refresh_interval" "$samples_count" \ - | stdbuf -o0 awk '{print 100-$(9)}' + |stdbuf -o0 grep all |stdbuf -o0 awk '{print 100-$(9)}' else sar -u "$refresh_interval" "$samples_count" \ - | stdbuf -o0 awk '{print 100-$(8)}' + |stdbuf -o0 grep all |stdbuf -o0 awk '{print 100-$(8)}' fi elif [ ! `command_exists "vmstat"` ]; then if is_freebsd; then From 150e87de4ddefc52da9cee6297d52def281a5aaa Mon Sep 17 00:00:00 2001 From: lijin Date: Mon, 5 Mar 2018 09:50:37 +0800 Subject: [PATCH 06/19] fix get row error --- scripts/cpu_collect.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/scripts/cpu_collect.sh b/scripts/cpu_collect.sh index 4edffaa..111a000 100755 --- a/scripts/cpu_collect.sh +++ b/scripts/cpu_collect.sh @@ -23,13 +23,18 @@ get_cpu_usage() { | stdbuf -o0 awk '{ print 100-$0 }' fi elif [ ! `command_exists "sar"` -a is_linux ]; then - SAR_STAT=`sar -u 1 1|awk '{ print $8}'|grep idle` - if [[ "$SAR_STAT" == "" ]]; then + GET_IDLE_STAT=`sar -u 1 1|awk '{ print $9}'` + case "$GET_IDLE_STAT" in + *"idle"*) ret=0 ;; + *) ret=1 ;; + esac + SAR_STAT=$ret + if [[ $SAR_STAT == 0 ]]; then sar -u "$refresh_interval" "$samples_count" \ |stdbuf -o0 grep all |stdbuf -o0 awk '{print 100-$(9)}' else sar -u "$refresh_interval" "$samples_count" \ - |stdbuf -o0 grep all |stdbuf -o0 awk '{print 100-$(8)}' + |stdbuf -o0 grep all |stdbuf -o0 awk '{print 100-$(3)}' fi elif [ ! `command_exists "vmstat"` ]; then if is_freebsd; then @@ -50,6 +55,7 @@ get_cpu_usage() { | stdbuf -o0 awk '{ print 100-$0 }' fi fi + echo "FF" } main() { From 151fafe33f962494b526d8d65c7850b510458eb5 Mon Sep 17 00:00:00 2001 From: vJames Vstech Date: Mon, 5 Mar 2018 10:53:13 +0800 Subject: [PATCH 07/19] fix error --- scripts/cpu_collect.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/cpu_collect.sh b/scripts/cpu_collect.sh index 111a000..27d1b03 100755 --- a/scripts/cpu_collect.sh +++ b/scripts/cpu_collect.sh @@ -34,7 +34,7 @@ get_cpu_usage() { |stdbuf -o0 grep all |stdbuf -o0 awk '{print 100-$(9)}' else sar -u "$refresh_interval" "$samples_count" \ - |stdbuf -o0 grep all |stdbuf -o0 awk '{print 100-$(3)}' + |stdbuf -o0 grep all |stdbuf -o0 awk '{print 100-$(8)}' fi elif [ ! `command_exists "vmstat"` ]; then if is_freebsd; then From 587e44564734a11867e0e818fa55c12ebcdf22a7 Mon Sep 17 00:00:00 2001 From: James Lee Date: Sat, 6 Oct 2018 19:11:25 +0800 Subject: [PATCH 08/19] fix multi thread --- scripts/cpu_collect.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/cpu_collect.sh b/scripts/cpu_collect.sh index 27d1b03..c8a931d 100755 --- a/scripts/cpu_collect.sh +++ b/scripts/cpu_collect.sh @@ -59,8 +59,20 @@ get_cpu_usage() { } main() { + i0=0 + CURENT_PROCESS_INFO=`ps ux |grep cpu_collect.sh|grep -v grep|grep -v vim` + echo "new" >> ~/cpu.log + if [[ $CURENT_PROCESS_INFO == "" ]]; then + exit + fi get_cpu_usage | while read -r value; do + TMUX_PROCESS_INFO=`ps ux|grep " tmux"|grep -v grep` echo "$value" | tee "$cpu_metric_file" + if [[ $TMUX_PROCESS_INFO == "" ]]; then + exit + fi + i0=$((i0+1)) + echo "value $value loop $i0 $(date)" >> ~/cpu.log done } From 4af6f22b29a39aea1b0df87e2705e7d9da3c174e Mon Sep 17 00:00:00 2001 From: James Lee Date: Sat, 6 Oct 2018 21:47:35 +0800 Subject: [PATCH 09/19] remove debug --- scripts/cpu_collect.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/cpu_collect.sh b/scripts/cpu_collect.sh index c8a931d..a52f927 100755 --- a/scripts/cpu_collect.sh +++ b/scripts/cpu_collect.sh @@ -61,7 +61,6 @@ get_cpu_usage() { main() { i0=0 CURENT_PROCESS_INFO=`ps ux |grep cpu_collect.sh|grep -v grep|grep -v vim` - echo "new" >> ~/cpu.log if [[ $CURENT_PROCESS_INFO == "" ]]; then exit fi @@ -72,7 +71,7 @@ main() { exit fi i0=$((i0+1)) - echo "value $value loop $i0 $(date)" >> ~/cpu.log + # echo "value $value loop $i0 $(date)" >> ~/cpu.log done } From 544bdee74a19a1f480beacbb66f75a9b94f0be8a Mon Sep 17 00:00:00 2001 From: James Lee Date: Sat, 6 Oct 2018 23:53:29 +0800 Subject: [PATCH 10/19] Change status bar update every 3s --- scripts/cpu_collect.sh | 76 +++++++++++++++++++++--------------------- scripts/helpers.sh | 26 +++++++++++++-- 2 files changed, 62 insertions(+), 40 deletions(-) diff --git a/scripts/cpu_collect.sh b/scripts/cpu_collect.sh index a52f927..b5a661e 100755 --- a/scripts/cpu_collect.sh +++ b/scripts/cpu_collect.sh @@ -8,54 +8,54 @@ set -e CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" source "$CURRENT_DIR/helpers.sh" -refresh_interval=$(get_tmux_option "status-interval" "5") +refresh_interval=$(get_tmux_option_ex "status-interval" "3" "force") samples_count="60" cpu_metric_file="$(get_tmux_option "@sysstat_cpu_tmp_dir" "/dev/null")/cpu_collect.metric" get_cpu_usage() { - if is_osx; then - if command_exists "iostat"; then - iostat -w "$refresh_interval" -c "$samples_count" \ - | stdbuf -o0 awk 'NR > 2 { print 100-$(NF-3); }' - else - top -l "$samples_count" -s "$refresh_interval" -n 0 \ - | sed -u -nr '/CPU usage/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)%[[:space:]]*idle.*/\1/p' \ - | stdbuf -o0 awk '{ print 100-$0 }' - fi - elif [ ! `command_exists "sar"` -a is_linux ]; then - GET_IDLE_STAT=`sar -u 1 1|awk '{ print $9}'` - case "$GET_IDLE_STAT" in + if is_osx; then + if command_exists "iostat"; then + iostat -w "$refresh_interval" -c "$samples_count" \ + | stdbuf -o0 awk 'NR > 2 { print 100-$(NF-3); }' + else + top -l "$samples_count" -s "$refresh_interval" -n 0 \ + | sed -u -nr '/CPU usage/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)%[[:space:]]*idle.*/\1/p' \ + | stdbuf -o0 awk '{ print 100-$0 }' + fi + elif [ ! `command_exists "sar"` -a is_linux ]; then + GET_IDLE_STAT=`sar -u 1 1|awk '{ print $9}'` + case "$GET_IDLE_STAT" in *"idle"*) ret=0 ;; - *) ret=1 ;; + *) ret=1 ;; esac - SAR_STAT=$ret - if [[ $SAR_STAT == 0 ]]; then + SAR_STAT=$ret + if [[ $SAR_STAT == 0 ]]; then sar -u "$refresh_interval" "$samples_count" \ |stdbuf -o0 grep all |stdbuf -o0 awk '{print 100-$(9)}' - else + else sar -u "$refresh_interval" "$samples_count" \ |stdbuf -o0 grep all |stdbuf -o0 awk '{print 100-$(8)}' - fi - elif [ ! `command_exists "vmstat"` ]; then - if is_freebsd; then - vmstat -n "$refresh_interval" -c "$samples_count" \ - | stdbuf -o0 awk 'NR>2 {print 100-$(NF-0)}' - else - vmstat -n "$refresh_interval" "$samples_count" \ - | stdbuf -o0 awk 'NR>2 {print 100-$(NF-2)}' - fi - else - if is_freebsd; then - top -d"$samples_count" \ - | sed -u -nr '/CPU:/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)%[[:space:]]*id.*/\1/p' \ - | stdbuf -o0 awk '{ print 100-$0 }' - else - top -b -n "$samples_count" -d "$refresh_interval" \ - | sed -u -nr '/%Cpu/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)[[:space:]]*id.*/\1/p' \ - | stdbuf -o0 awk '{ print 100-$0 }' - fi - fi - echo "FF" + fi + elif [ ! `command_exists "vmstat"` ]; then + if is_freebsd; then + vmstat -n "$refresh_interval" -c "$samples_count" \ + | stdbuf -o0 awk 'NR>2 {print 100-$(NF-0)}' + else + vmstat -n "$refresh_interval" "$samples_count" \ + | stdbuf -o0 awk 'NR>2 {print 100-$(NF-2)}' + fi + else + if is_freebsd; then + top -d"$samples_count" \ + | sed -u -nr '/CPU:/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)%[[:space:]]*id.*/\1/p' \ + | stdbuf -o0 awk '{ print 100-$0 }' + else + top -b -n "$samples_count" -d "$refresh_interval" \ + | sed -u -nr '/%Cpu/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)[[:space:]]*id.*/\1/p' \ + | stdbuf -o0 awk '{ print 100-$0 }' + fi + fi + echo "FF" } main() { diff --git a/scripts/helpers.sh b/scripts/helpers.sh index 92793b3..54110cf 100755 --- a/scripts/helpers.sh +++ b/scripts/helpers.sh @@ -4,9 +4,9 @@ get_tmux_option() { local default_value="$2" local option_value="$(tmux show-option -gqv "$option")" if [ -z "$option_value" ]; then - echo "$default_value" + echo "$default_value" else - echo "$option_value" + echo "$option_value" fi } @@ -16,6 +16,28 @@ set_tmux_option() { tmux set-option -gq "$option" "$value" } +get_tmux_option_ex() { + local option=$1 + local default_value=$2 + local force_icon=$3 + if [[ $force_icon == "force" ]]; then + local option_value=$(tmux show-option -gqv "$option") + if [[ $option_value != $default_value ]]; then + set_tmux_option "$option" "$default_value" + fi + fi + local option_value=$(tmux show-option -gqv "$option") + if [[ $force_icon == "custom" ]]; then + echo "$default_value" + elif [[ $force_icon == "force" ]]; then + echo "$option_value" + elif [[ $option_value != "" ]]; then + echo "$option_value" + else + echo "$default_value" + # echo "$option_value" + fi +} is_osx() { [ $(uname) == "Darwin" ] } From 4b6dc240f36cb9387d431d52bc232f9c65eed979 Mon Sep 17 00:00:00 2001 From: James Lee Date: Sun, 5 May 2019 10:34:37 +0800 Subject: [PATCH 11/19] fix sar no exist --- scripts/cpu_collect.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/cpu_collect.sh b/scripts/cpu_collect.sh index b5a661e..1d7c192 100755 --- a/scripts/cpu_collect.sh +++ b/scripts/cpu_collect.sh @@ -22,7 +22,7 @@ get_cpu_usage() { | sed -u -nr '/CPU usage/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)%[[:space:]]*idle.*/\1/p' \ | stdbuf -o0 awk '{ print 100-$0 }' fi - elif [ ! `command_exists "sar"` -a is_linux ]; then + elif [ `command_exists "sar"` -a is_linux ]; then GET_IDLE_STAT=`sar -u 1 1|awk '{ print $9}'` case "$GET_IDLE_STAT" in *"idle"*) ret=0 ;; From 5ee63b216d85d33856235143714de5d4dfdcd01f Mon Sep 17 00:00:00 2001 From: lijin Date: Fri, 28 Jun 2019 10:43:38 +0800 Subject: [PATCH 12/19] update load avg --- scripts/loadavg.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/loadavg.sh b/scripts/loadavg.sh index 7152314..af94562 100755 --- a/scripts/loadavg.sh +++ b/scripts/loadavg.sh @@ -21,7 +21,7 @@ main(){ sub(/,$/, "", $(NF-2)); sub(/,$/, "", $(NF-1)); sub(/,$/, "", $NF); - printf "%.2f %.2f %.2f", $(NF-2)/num_cores, $(NF-1)/num_cores, $NF/num_cores + printf "%.2f %.2f %.2f", $(NF-2), $(NF-1), $NF }' } From fa0018c089131c99b6fd7ec68ef8942fd4ae0c99 Mon Sep 17 00:00:00 2001 From: lijin Date: Fri, 28 Jun 2019 17:11:04 +0800 Subject: [PATCH 13/19] add color for loadavg --- scripts/cpu.sh | 4 +-- scripts/loadavg.sh | 61 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/scripts/cpu.sh b/scripts/cpu.sh index adc2223..1c381d0 100755 --- a/scripts/cpu.sh +++ b/scripts/cpu.sh @@ -34,7 +34,7 @@ get_cpu_color(){ print_cpu_usage() { local cpu_pused=$(get_cpu_usage_or_collect) local cpu_color=$(get_cpu_color "$cpu_pused") - + local cpu_view="$cpu_view_tmpl" cpu_view="${cpu_view//'#{cpu.pused}'/$(printf "%.1f%%" "$cpu_pused")}" cpu_view="${cpu_view//'#{cpu.color}'/$(echo "$cpu_color" | awk '{ print $1 }')}" @@ -60,7 +60,7 @@ start_cpu_collect_if_required() { if [ -f "$collect_cpu_pidfile" ] && ps -p "$(cat "$collect_cpu_pidfile")" > /dev/null 2>&1; then return; fi - + jobs >/dev/null 2>&1 "$CURRENT_DIR/cpu_collect.sh" &>/dev/null & if [ -n "$(jobs -n)" ]; then diff --git a/scripts/loadavg.sh b/scripts/loadavg.sh index af94562..00ba627 100755 --- a/scripts/loadavg.sh +++ b/scripts/loadavg.sh @@ -9,20 +9,67 @@ CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" source "$CURRENT_DIR/helpers.sh" loadavg_per_cpu_core=$(get_tmux_option "@sysstat_loadavg_per_cpu_core" "true") +loadavg_color_low=$(get_tmux_option "@sysstat_cpu_color_low" "green") +loadavg_color_medium=$(get_tmux_option "@sysstat_cpu_color_medium" "yellow") +loadavg_color_stress=$(get_tmux_option "@sysstat_cpu_color_stress" "red") +loadavg_view_tmpl=$(get_tmux_option "@sysstat_cpu_view_tmpl" '#[fg=#{cpu.color}]#{cpu.pused}#[default]') + +loadavg_medium_threshold=$(get_tmux_option "@sysstat_cpu_medium_threshold" "0.8") +loadavg_stress_threshold=$(get_tmux_option "@sysstat_cpu_stress_threshold" "1.0") get_num_of_cores(){ is_osx && sysctl -n hw.ncpu || nproc } -main(){ +get_loadavg_color(){ + local loadavg_used=$1 + + if fcomp "$loadavg_stress_threshold" "$loadavg_used"; then + echo "$loadavg_color_stress"; + elif fcomp "$loadavg_medium_threshold" "$loadavg_used"; then + echo "$loadavg_color_medium"; + else + echo "$loadavg_color_low"; + fi +} + +main(){ local num_cores=$([ "$loadavg_per_cpu_core" == "true" ] && get_num_of_cores || echo 1) - uptime | awk -v num_cores="$num_cores" '{ - sub(/,$/, "", $(NF-2)); - sub(/,$/, "", $(NF-1)); - sub(/,$/, "", $NF); - printf "%.2f %.2f %.2f", $(NF-2), $(NF-1), $NF - }' + # num_cores=1 + + UPTIME_INFO=`uptime` + UPTIME_INFO=${UPTIME_INFO##*load average:} + load_15min=`echo ${UPTIME_INFO}|cut -f 1 -d ","` + load_5min=`echo ${UPTIME_INFO}|cut -f 2 -d ","` + load_1min=`echo ${UPTIME_INFO}|cut -f 3 -d ","` + load_15min=`echo $load_15min|awk -v num_cores="$num_cores" '{ printf "%.2f", $0/num_cores }'` + load_5min=`echo $load_5min|awk -v num_cores="$num_cores" '{ printf "%.2f", $0/num_cores }'` + load_1min=`echo $load_1min|awk -v num_cores="$num_cores" '{ printf "%.2f", $0/num_cores }'` + + local loadavg_view="$loadavg_view_tmpl" + + loadavg_color_15min=$(get_loadavg_color "$load_15min") + loadavg_view_15min="${loadavg_view//'#{cpu.color}'/$(echo "$loadavg_color_15min" | awk '{ print $1 }')}" + loadavg_view_15min="${loadavg_view_15min//'#{cpu.pused}'/$(echo "$load_15min" | awk '{ print $1 }')}" + + loadavg_color_5min=$(get_loadavg_color "$load_5min") + loadavg_view_5min="${loadavg_view//'#{cpu.color}'/$(echo "$loadavg_color_5min" | awk '{ print $1 }')}" + loadavg_view_5min="${loadavg_view_5min//'#{cpu.pused}'/$(echo "$load_5min" | awk '{ print $1 }')}" + + loadavg_color_1min=$(get_loadavg_color "$load_1min") + loadavg_view_1min="${loadavg_view//'#{cpu.color}'/$(echo "$loadavg_color_1min" | awk '{ print $1 }')}" + loadavg_view_1min="${loadavg_view_1min//'#{cpu.pused}'/$(echo "$load_1min" | awk '{ print $1 }')}" + + printf "$loadavg_view_15min $loadavg_view_5min $loadavg_view_1min" + # printf "$load_15min $load_5min $load_1min" + + # uptime | awk -v num_cores="$num_cores" '{ + # sub(/,$/, "", $(NF-2)); + # sub(/,$/, "", $(NF-1)); + # sub(/,$/, "", $NF); + # printf "%.2f %.2f %.2f", $(NF-2), $(NF-1), $NF + # }' } main From d1ad5b52b339b966b2f9354b6121317525f1f432 Mon Sep 17 00:00:00 2001 From: James Lee Date: Wed, 21 Apr 2021 20:50:07 +0800 Subject: [PATCH 14/19] update ui --- {screenshots => preview}/cpu_thresholds.png | Bin {screenshots => preview}/intro.png | Bin scripts/cpu.sh | 2 +- scripts/helpers.sh | 10 +++++----- scripts/loadavg.sh | 17 +++++++++++------ scripts/mem.sh | 11 ++++++++++- sysstat.tmux | 3 ++- 7 files changed, 29 insertions(+), 14 deletions(-) rename {screenshots => preview}/cpu_thresholds.png (100%) rename {screenshots => preview}/intro.png (100%) diff --git a/screenshots/cpu_thresholds.png b/preview/cpu_thresholds.png similarity index 100% rename from screenshots/cpu_thresholds.png rename to preview/cpu_thresholds.png diff --git a/screenshots/intro.png b/preview/intro.png similarity index 100% rename from screenshots/intro.png rename to preview/intro.png diff --git a/scripts/cpu.sh b/scripts/cpu.sh index 1c381d0..c588edd 100755 --- a/scripts/cpu.sh +++ b/scripts/cpu.sh @@ -10,7 +10,7 @@ source "$CURRENT_DIR/helpers.sh" cpu_tmp_dir=$(tmux show-option -gqv "@sysstat_cpu_tmp_dir") -cpu_view_tmpl=$(get_tmux_option "@sysstat_cpu_view_tmpl" 'CPU:#[fg=#{cpu.color}]#{cpu.pused}#[default]') +cpu_view_tmpl=$(get_tmux_option "@sysstat_cpu_view_tmpl" '#[bg=#3e4452]U:#[fg=#{cpu.color},bg=#3e4452]#{cpu.pused}#[fg=#aab2bf,bg=#3e4452] #[default]') cpu_medium_threshold=$(get_tmux_option "@sysstat_cpu_medium_threshold" "30") cpu_stress_threshold=$(get_tmux_option "@sysstat_cpu_stress_threshold" "80") diff --git a/scripts/helpers.sh b/scripts/helpers.sh index 54110cf..5b6b889 100755 --- a/scripts/helpers.sh +++ b/scripts/helpers.sh @@ -74,7 +74,7 @@ fcomp() { # 1048576 - scale to GiB function get_size_scale_factor(){ local size_unit="$1" - case "$size_unit" in + case "$size_unit" in G) echo 1048576;; M) echo 1024;; K) echo 1;; @@ -84,15 +84,15 @@ function get_size_scale_factor(){ # Depending on scale factor, change precision # 12612325K - no digits after floating point # 1261M - no digits after floating point -# 1.1G - 1 digit after floating point +# 1.1G - 1 digit after floating point function get_size_format(){ local size_unit="$1" - case "$size_unit" in + case "$size_unit" in G) echo '%.1f%s';; M) echo '%.0f%s';; K) echo '%.0f%s';; esac } - - + + diff --git a/scripts/loadavg.sh b/scripts/loadavg.sh index 00ba627..e8dfa5b 100755 --- a/scripts/loadavg.sh +++ b/scripts/loadavg.sh @@ -3,6 +3,10 @@ set -u set -e +onedark_comment_grey="#5c6370" +onedark_visual_grey="#3e4452" +onedark_blue="#61afef" + LC_NUMERIC=C CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" @@ -12,7 +16,7 @@ loadavg_per_cpu_core=$(get_tmux_option "@sysstat_loadavg_per_cpu_core" "true") loadavg_color_low=$(get_tmux_option "@sysstat_cpu_color_low" "green") loadavg_color_medium=$(get_tmux_option "@sysstat_cpu_color_medium" "yellow") loadavg_color_stress=$(get_tmux_option "@sysstat_cpu_color_stress" "red") -loadavg_view_tmpl=$(get_tmux_option "@sysstat_cpu_view_tmpl" '#[fg=#{cpu.color}]#{cpu.pused}#[default]') +loadavg_view_tmpl=$(get_tmux_option "@sysstat_cpu_view_tmpl" '#[fg=#{cpu.color},bg=#3e4452]#{cpu.pused}#[default]') loadavg_medium_threshold=$(get_tmux_option "@sysstat_cpu_medium_threshold" "0.8") loadavg_stress_threshold=$(get_tmux_option "@sysstat_cpu_stress_threshold" "1.0") @@ -47,21 +51,21 @@ main(){ load_5min=`echo $load_5min|awk -v num_cores="$num_cores" '{ printf "%.2f", $0/num_cores }'` load_1min=`echo $load_1min|awk -v num_cores="$num_cores" '{ printf "%.2f", $0/num_cores }'` - local loadavg_view="$loadavg_view_tmpl" + local loadavg_view="${loadavg_view_tmpl}" loadavg_color_15min=$(get_loadavg_color "$load_15min") loadavg_view_15min="${loadavg_view//'#{cpu.color}'/$(echo "$loadavg_color_15min" | awk '{ print $1 }')}" - loadavg_view_15min="${loadavg_view_15min//'#{cpu.pused}'/$(echo "$load_15min" | awk '{ print $1 }')}" + loadavg_view_15min="${loadavg_view_15min//'#{cpu.pused}'/$(echo "$load_15min" | awk '{ print $1" " }')}" loadavg_color_5min=$(get_loadavg_color "$load_5min") loadavg_view_5min="${loadavg_view//'#{cpu.color}'/$(echo "$loadavg_color_5min" | awk '{ print $1 }')}" - loadavg_view_5min="${loadavg_view_5min//'#{cpu.pused}'/$(echo "$load_5min" | awk '{ print $1 }')}" + loadavg_view_5min="${loadavg_view_5min//'#{cpu.pused}'/$(echo "$load_5min" | awk '{ print $1" " }')}" loadavg_color_1min=$(get_loadavg_color "$load_1min") loadavg_view_1min="${loadavg_view//'#{cpu.color}'/$(echo "$loadavg_color_1min" | awk '{ print $1 }')}" - loadavg_view_1min="${loadavg_view_1min//'#{cpu.pused}'/$(echo "$load_1min" | awk '{ print $1 }')}" + loadavg_view_1min="${loadavg_view_1min//'#{cpu.pused}'/$(echo "$load_1min" | awk '{ print $1"" }')}" - printf "$loadavg_view_15min $loadavg_view_5min $loadavg_view_1min" + printf "${loadavg_view_15min}${loadavg_view_5min}${loadavg_view_1min}#[bg=#3e4452]" # printf "$load_15min $load_5min $load_1min" # uptime | awk -v num_cores="$num_cores" '{ @@ -73,3 +77,4 @@ main(){ } main + diff --git a/scripts/mem.sh b/scripts/mem.sh index 6a032bf..1c4ed6f 100755 --- a/scripts/mem.sh +++ b/scripts/mem.sh @@ -1,5 +1,14 @@ #!/usr/bin/env bash +onedark_black="#282c34" +onedark_blue="#61afef" +onedark_yellow="#e5c07b" +onedark_red="#e06c75" +onedark_white="#aab2bf" +onedark_green="#98c379" +onedark_visual_grey="#3e4452" +onedark_comment_grey="#5c6370" + set -u set -e @@ -8,7 +17,7 @@ LC_NUMERIC=C CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" source "$CURRENT_DIR/helpers.sh" -mem_view_tmpl=$(get_tmux_option "@sysstat_mem_view_tmpl" 'MEM:#[fg=#{mem.color}]#{mem.pused}#[default]') +mem_view_tmpl=$(get_tmux_option "@sysstat_mem_view_tmpl" '#[bg=#3e4452]M:#[fg=#{mem.color},bg=#3e4452]#{mem.pused}#[fg=#aab2bf,bg=#3e4452]  #[default]') mem_medium_threshold=$(get_tmux_option "@sysstat_mem_medium_threshold" "75") mem_stress_threshold=$(get_tmux_option "@sysstat_mem_stress_threshold" "90") diff --git a/sysstat.tmux b/sysstat.tmux index d44efdb..541a4b1 100755 --- a/sysstat.tmux +++ b/sysstat.tmux @@ -40,4 +40,5 @@ main() { update_tmux_option "status-left" } -main \ No newline at end of file +main + From 1ab7766177dfb89da555198d6fe09241dedc3ca0 Mon Sep 17 00:00:00 2001 From: James Lee Date: Fri, 23 Apr 2021 09:57:24 +0800 Subject: [PATCH 15/19] tmux: optimize tmux cpu usage display --- scripts/cpu.sh | 130 +++++++++++++++++++++++++++++------------ scripts/cpu_collect.sh | 79 ------------------------- sysstat.tmux | 4 +- 3 files changed, 95 insertions(+), 118 deletions(-) delete mode 100755 scripts/cpu_collect.sh diff --git a/scripts/cpu.sh b/scripts/cpu.sh index c588edd..b9d4caf 100755 --- a/scripts/cpu.sh +++ b/scripts/cpu.sh @@ -19,60 +19,116 @@ cpu_color_low=$(get_tmux_option "@sysstat_cpu_color_low" "green") cpu_color_medium=$(get_tmux_option "@sysstat_cpu_color_medium" "yellow") cpu_color_stress=$(get_tmux_option "@sysstat_cpu_color_stress" "red") +refresh_interval=$(get_tmux_option_ex "status-interval" "3" "force") +samples_count="1" +cpu_usage_val=0 +cpu_idle_val=0 + get_cpu_color(){ - local cpu_used=$1 - - if fcomp "$cpu_stress_threshold" "$cpu_used"; then - echo "$cpu_color_stress"; - elif fcomp "$cpu_medium_threshold" "$cpu_used"; then - echo "$cpu_color_medium"; - else - echo "$cpu_color_low"; - fi + local cpu_used=$1 + + if fcomp "$cpu_stress_threshold" "$cpu_used"; then + echo "$cpu_color_stress"; + elif fcomp "$cpu_medium_threshold" "$cpu_used"; then + echo "$cpu_color_medium"; + else + echo "$cpu_color_low"; + fi +} + +get_cpu_usage() { + if is_osx; then + echo "======$LINENO" + if command_exists "iostat"; then + cpu_usage_val=$(iostat -w "$refresh_interval" -c "$samples_count" \ + | stdbuf -o0 awk 'NR > 2 { print 100-$(NF-3); }') + else + cpu_usage_val=$(top -l "$samples_count" -s "$refresh_interval" -n 0 \ + | sed -u -nr '/CPU usage/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)%[[:space:]]*idle.*/\1/p' \ + | stdbuf -o0 awk '{ print 100-$0 }') + fi + elif is_linux ; then + if [ ! `command_exists "iostat"` ]; then + sar_output_val=$(env LANG=en_US iostat -c 1 2|grep idle -A 1|tail -n 2) + for item in $sar_output_val; + do + cpu_idle_val=$item + done + cpu_usage_val=$(echo ${cpu_idle_val}|awk '{print 100-$NF}') + elif [ ! `command_exists "sar"` ]; then + sar_output_val=$(env LANG=en_US sar -u 1 1|grep idle -A 1) + for item in $sar_output_val; + do + cpu_idle_val=$item + done + cpu_usage_val=$(echo ${cpu_idle_val}|awk '{print 100-$NF}') + elif [ ! `command_exists "vmstat"` ]; then + if is_freebsd; then + cpu_usage_val=$(vmstat -n "$refresh_interval" -c "$samples_count" \ + | stdbuf -o0 awk 'NR>2 {print 100-$(NF-0)}') + else + cpu_usage_val=$(vmstat -n "$refresh_interval" "$samples_count" \ + | stdbuf -o0 awk 'NR>2 {print 100-$(NF-2)}') + fi + fi + else + if is_freebsd; then + cpu_usage_val=$(top -d"$samples_count" \ + | sed -u -nr '/CPU:/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)%[[:space:]]*id.*/\1/p' \ + | stdbuf -o0 awk '{ print 100-$0 }') + else + cpu_usage_val=$(top -b -n "$samples_count" -d "$refresh_interval" \ + | sed -u -nr '/%Cpu/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)[[:space:]]*id.*/\1/p' \ + | stdbuf -o0 awk '{ print 100-$0 }') + fi + fi } print_cpu_usage() { - local cpu_pused=$(get_cpu_usage_or_collect) - local cpu_color=$(get_cpu_color "$cpu_pused") + local cpu_pused=$cpu_usage_val + local cpu_color=$(get_cpu_color "$cpu_pused") + + local cpu_view="$cpu_view_tmpl" - local cpu_view="$cpu_view_tmpl" - cpu_view="${cpu_view//'#{cpu.pused}'/$(printf "%.1f%%" "$cpu_pused")}" - cpu_view="${cpu_view//'#{cpu.color}'/$(echo "$cpu_color" | awk '{ print $1 }')}" - cpu_view="${cpu_view//'#{cpu.color2}'/$(echo "$cpu_color" | awk '{ print $2 }')}" - cpu_view="${cpu_view//'#{cpu.color3}'/$(echo "$cpu_color" | awk '{ print $3 }')}" + get_cpu_usage + cpu_pused=$cpu_usage_val + cpu_view="${cpu_view//'#{cpu.pused}'/$(printf "%.1f%%" "$cpu_pused")}" + cpu_view="${cpu_view//'#{cpu.color}'/$(echo "$cpu_color" | awk '{ print $1 }')}" + cpu_view="${cpu_view//'#{cpu.color2}'/$(echo "$cpu_color" | awk '{ print $2 }')}" + cpu_view="${cpu_view//'#{cpu.color3}'/$(echo "$cpu_color" | awk '{ print $3 }')}" - echo "$cpu_view" + echo "$cpu_view" } get_cpu_usage_or_collect() { - local collect_cpu_metric="$cpu_tmp_dir/cpu_collect.metric" + local collect_cpu_metric="$cpu_tmp_dir/cpu_collect.metric" - # read cpu metric from file, otherwise 0 as a temporary null value, until first cpu metric is collected - [ -f "$collect_cpu_metric" ] && cat "$collect_cpu_metric" || echo "0.0" + # read cpu metric from file, otherwise 0 as a temporary null value, until first cpu metric is collected + [ -f "$collect_cpu_metric" ] && cat "$collect_cpu_metric" || echo "0.0" - start_cpu_collect_if_required >/dev/null 2>&1 + start_cpu_collect_if_required >/dev/null 2>&1 } start_cpu_collect_if_required() { - local collect_cpu_pidfile="$cpu_tmp_dir/cpu_collect.pid" - - # check if cpu collect process is running, otherwise start it in background - if [ -f "$collect_cpu_pidfile" ] && ps -p "$(cat "$collect_cpu_pidfile")" > /dev/null 2>&1; then - return; - fi - - jobs >/dev/null 2>&1 - "$CURRENT_DIR/cpu_collect.sh" &>/dev/null & - if [ -n "$(jobs -n)" ]; then - echo "$!" > "${collect_cpu_pidfile}" - else - echo "Failed to start CPU collect job" >&2 - exit 1 - fi + local collect_cpu_pidfile="$cpu_tmp_dir/cpu_collect.pid" + + # check if cpu collect process is running, otherwise start it in background + if [ -f "$collect_cpu_pidfile" ] && ps -p "$(cat "$collect_cpu_pidfile")" > /dev/null 2>&1; then + return; + fi + + jobs >/dev/null 2>&1 + "$CURRENT_DIR/cpu_collect.sh" &>/dev/null & + if [ -n "$(jobs -n)" ]; then + echo "$!" > "${collect_cpu_pidfile}" + else + echo "Failed to start CPU collect job" >&2 + exit 1 + fi } main(){ - print_cpu_usage + print_cpu_usage } main diff --git a/scripts/cpu_collect.sh b/scripts/cpu_collect.sh deleted file mode 100755 index 1d7c192..0000000 --- a/scripts/cpu_collect.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env bash - -LC_NUMERIC=C - -set -u -set -e - -CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -source "$CURRENT_DIR/helpers.sh" - -refresh_interval=$(get_tmux_option_ex "status-interval" "3" "force") -samples_count="60" -cpu_metric_file="$(get_tmux_option "@sysstat_cpu_tmp_dir" "/dev/null")/cpu_collect.metric" - -get_cpu_usage() { - if is_osx; then - if command_exists "iostat"; then - iostat -w "$refresh_interval" -c "$samples_count" \ - | stdbuf -o0 awk 'NR > 2 { print 100-$(NF-3); }' - else - top -l "$samples_count" -s "$refresh_interval" -n 0 \ - | sed -u -nr '/CPU usage/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)%[[:space:]]*idle.*/\1/p' \ - | stdbuf -o0 awk '{ print 100-$0 }' - fi - elif [ `command_exists "sar"` -a is_linux ]; then - GET_IDLE_STAT=`sar -u 1 1|awk '{ print $9}'` - case "$GET_IDLE_STAT" in - *"idle"*) ret=0 ;; - *) ret=1 ;; - esac - SAR_STAT=$ret - if [[ $SAR_STAT == 0 ]]; then - sar -u "$refresh_interval" "$samples_count" \ - |stdbuf -o0 grep all |stdbuf -o0 awk '{print 100-$(9)}' - else - sar -u "$refresh_interval" "$samples_count" \ - |stdbuf -o0 grep all |stdbuf -o0 awk '{print 100-$(8)}' - fi - elif [ ! `command_exists "vmstat"` ]; then - if is_freebsd; then - vmstat -n "$refresh_interval" -c "$samples_count" \ - | stdbuf -o0 awk 'NR>2 {print 100-$(NF-0)}' - else - vmstat -n "$refresh_interval" "$samples_count" \ - | stdbuf -o0 awk 'NR>2 {print 100-$(NF-2)}' - fi - else - if is_freebsd; then - top -d"$samples_count" \ - | sed -u -nr '/CPU:/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)%[[:space:]]*id.*/\1/p' \ - | stdbuf -o0 awk '{ print 100-$0 }' - else - top -b -n "$samples_count" -d "$refresh_interval" \ - | sed -u -nr '/%Cpu/s/.*,[[:space:]]*([0-9]+[.,][0-9]*)[[:space:]]*id.*/\1/p' \ - | stdbuf -o0 awk '{ print 100-$0 }' - fi - fi - echo "FF" -} - -main() { - i0=0 - CURENT_PROCESS_INFO=`ps ux |grep cpu_collect.sh|grep -v grep|grep -v vim` - if [[ $CURENT_PROCESS_INFO == "" ]]; then - exit - fi - get_cpu_usage | while read -r value; do - TMUX_PROCESS_INFO=`ps ux|grep " tmux"|grep -v grep` - echo "$value" | tee "$cpu_metric_file" - if [[ $TMUX_PROCESS_INFO == "" ]]; then - exit - fi - i0=$((i0+1)) - # echo "value $value loop $i0 $(date)" >> ~/cpu.log - done -} - -main - diff --git a/sysstat.tmux b/sysstat.tmux index 541a4b1..65efede 100755 --- a/sysstat.tmux +++ b/sysstat.tmux @@ -33,8 +33,8 @@ update_tmux_option() { } main() { - cpu_tmp_dir=$(mktemp -d) - tmux set-option -gq "@sysstat_cpu_tmp_dir" "$cpu_tmp_dir" + # cpu_tmp_dir=$(mktemp -d) + # tmux set-option -gq "@sysstat_cpu_tmp_dir" "$cpu_tmp_dir" update_tmux_option "status-right" update_tmux_option "status-left" From 82ff56e13c2437cbc17c2156c39a99a5bc77222f Mon Sep 17 00:00:00 2001 From: James Lee Date: Fri, 23 Apr 2021 10:56:16 +0800 Subject: [PATCH 16/19] tmux: update cpu/mem/loadavg color --- scripts/cpu.sh | 17 ++++++++++++++++- scripts/helpers.sh | 14 ++++++++++++++ scripts/loadavg.sh | 14 +++++++++++++- scripts/mem.sh | 13 ++++++++++++- 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/scripts/cpu.sh b/scripts/cpu.sh index b9d4caf..ba056d7 100755 --- a/scripts/cpu.sh +++ b/scripts/cpu.sh @@ -24,7 +24,7 @@ samples_count="1" cpu_usage_val=0 cpu_idle_val=0 -get_cpu_color(){ +get_cpu_color_old(){ local cpu_used=$1 if fcomp "$cpu_stress_threshold" "$cpu_used"; then @@ -36,6 +36,18 @@ get_cpu_color(){ fi } +get_cpu_color(){ + local cpu_used=$1 + + cpu_used=${cpu_used%.*} + cpu_used_num=$((cpu_used / 10)) + if [[ $cpu_used_num -ge 10 ]]; then + cpu_used_num=10 + fi + echo "#${sysstat_color_map[$cpu_used_num]}" +} + + get_cpu_usage() { if is_osx; then echo "======$LINENO" @@ -92,6 +104,8 @@ print_cpu_usage() { get_cpu_usage cpu_pused=$cpu_usage_val + cpu_color=$(get_cpu_color "$cpu_pused") + cpu_view="${cpu_view//'#{cpu.pused}'/$(printf "%.1f%%" "$cpu_pused")}" cpu_view="${cpu_view//'#{cpu.color}'/$(echo "$cpu_color" | awk '{ print $1 }')}" cpu_view="${cpu_view//'#{cpu.color2}'/$(echo "$cpu_color" | awk '{ print $2 }')}" @@ -129,6 +143,7 @@ start_cpu_collect_if_required() { main(){ print_cpu_usage + # get_cpu_color 120.44 } main diff --git a/scripts/helpers.sh b/scripts/helpers.sh index 5b6b889..fd8568c 100755 --- a/scripts/helpers.sh +++ b/scripts/helpers.sh @@ -1,4 +1,18 @@ +sysstat_color_map=( + 5fff00 + 87ff00 + afff00 + d7ff00 + ffff00 + ffd700 + ffaf00 + ff8700 + ff5f00 + d70000 + ff0000 +) + get_tmux_option() { local option="$1" local default_value="$2" diff --git a/scripts/loadavg.sh b/scripts/loadavg.sh index e8dfa5b..976e598 100755 --- a/scripts/loadavg.sh +++ b/scripts/loadavg.sh @@ -25,7 +25,7 @@ get_num_of_cores(){ is_osx && sysctl -n hw.ncpu || nproc } -get_loadavg_color(){ +get_loadavg_color_old(){ local loadavg_used=$1 if fcomp "$loadavg_stress_threshold" "$loadavg_used"; then @@ -36,6 +36,18 @@ get_loadavg_color(){ echo "$loadavg_color_low"; fi } +get_loadavg_color(){ + local loadavg_used=$1 + + loadavg_used=$(echo ${loadavg_used}|awk '{print 10*$NF}') + loadavg_used=${loadavg_used%.*} + loadavg_used_num=$((loadavg_used / 1)) + if [[ $loadavg_used_num -ge 10 ]]; then + loadavg_used_num=10 + fi + echo "#${sysstat_color_map[$loadavg_used_num]}" +} + main(){ local num_cores=$([ "$loadavg_per_cpu_core" == "true" ] && get_num_of_cores || echo 1) diff --git a/scripts/mem.sh b/scripts/mem.sh index 1c4ed6f..e26ee63 100755 --- a/scripts/mem.sh +++ b/scripts/mem.sh @@ -28,7 +28,7 @@ mem_color_stress=$(get_tmux_option "@sysstat_mem_color_stress" "red") size_unit=$(get_tmux_option "@sysstat_mem_size_unit" "G") -get_mem_color() { +get_mem_color_old() { local mem_pused=$1 if fcomp "$mem_stress_threshold" "$mem_pused"; then @@ -40,6 +40,17 @@ get_mem_color() { fi } +get_mem_color(){ + local mem_used=$1 + + mem_used=${mem_used%.*} + mem_used_num=$((mem_used / 10)) + if [[ $mem_used_num -ge 10 ]]; then + mem_used_num=10 + fi + echo "#${sysstat_color_map[$mem_used_num]}" +} + print_mem() { local mem_usage local scale From b8c91387d7d705905825e69e3a61664f894ca98f Mon Sep 17 00:00:00 2001 From: lijin Date: Wed, 9 Oct 2024 14:11:59 +0800 Subject: [PATCH 17/19] Update cpu/mem used display --- scripts/Makefile | 8 + scripts/{ => old.scripts}/cpu.sh | 0 scripts/{ => old.scripts}/helpers.sh | 0 scripts/{ => old.scripts}/loadavg.sh | 0 scripts/{ => old.scripts}/mem.sh | 0 scripts/{ => old.scripts}/swap.sh | 0 scripts/sysstat.cpp | 249 +++++++++++++++++++++++++++ sysstat.tmux | 5 +- 8 files changed, 258 insertions(+), 4 deletions(-) create mode 100644 scripts/Makefile rename scripts/{ => old.scripts}/cpu.sh (100%) rename scripts/{ => old.scripts}/helpers.sh (100%) rename scripts/{ => old.scripts}/loadavg.sh (100%) rename scripts/{ => old.scripts}/mem.sh (100%) rename scripts/{ => old.scripts}/swap.sh (100%) create mode 100644 scripts/sysstat.cpp diff --git a/scripts/Makefile b/scripts/Makefile new file mode 100644 index 0000000..ad00546 --- /dev/null +++ b/scripts/Makefile @@ -0,0 +1,8 @@ + + +all: + $(CXX) sysstat.cpp -o tmux_sysstat + + +clean: + rm -rf tmux_sysstat diff --git a/scripts/cpu.sh b/scripts/old.scripts/cpu.sh similarity index 100% rename from scripts/cpu.sh rename to scripts/old.scripts/cpu.sh diff --git a/scripts/helpers.sh b/scripts/old.scripts/helpers.sh similarity index 100% rename from scripts/helpers.sh rename to scripts/old.scripts/helpers.sh diff --git a/scripts/loadavg.sh b/scripts/old.scripts/loadavg.sh similarity index 100% rename from scripts/loadavg.sh rename to scripts/old.scripts/loadavg.sh diff --git a/scripts/mem.sh b/scripts/old.scripts/mem.sh similarity index 100% rename from scripts/mem.sh rename to scripts/old.scripts/mem.sh diff --git a/scripts/swap.sh b/scripts/old.scripts/swap.sh similarity index 100% rename from scripts/swap.sh rename to scripts/old.scripts/swap.sh diff --git a/scripts/sysstat.cpp b/scripts/sysstat.cpp new file mode 100644 index 0000000..89b6c67 --- /dev/null +++ b/scripts/sysstat.cpp @@ -0,0 +1,249 @@ +/* + * ===================================================================================== + * + * Filename: sysstat.cpp + * + * Description: Description + * + * Version: 1.0 + * Created: 2024年10月09日 11时23分59秒 + * Revision: none + * Compiler: gcc + * + * Author: lijin (jin), jinli@syncore.space + * Organization: SYNCORE + * + * ===================================================================================== + */ + +#include +#include +#include +#include + +enum DispColorSt { + DISP_COLOR_LIGHT_GREEN = 0x5fff00, + DISP_COLOR_GREEN = 0x98c379, + DISP_COLOR_YELLOW = 0xe5c07b, + DISP_COLOR_RED = 0xe06c75, +}; + +// 用来存储内存信息的结构体 +typedef struct { + long long totalMem; + long long freeMem; +} MemoryInfo; + +// 从 /proc/meminfo 文件中读取内存信息 +MemoryInfo getMemoryInfo() { + FILE *fp = fopen("/proc/meminfo", "r"); + if (fp == NULL) { + perror("Failed to open /proc/meminfo"); + exit(EXIT_FAILURE); + } + + MemoryInfo memInfo = {0, 0}; + char line[256]; + + while (fgets(line, sizeof(line), fp)) { + long long value; + if (sscanf(line, "MemTotal: %lld kB", &value) == 1) { + memInfo.totalMem = value; + } + if (sscanf(line, "MemFree: %lld kB", &value) == 1) { + memInfo.freeMem = value; + } + // 如果还需要其他内存信息,可以在这里继续添加解析代码 + } + + fclose(fp); + return memInfo; +} + +#include +#include +#include +#include + +// 用来存储CPU时间片的结构体 +typedef struct { + long long user; + long long nice; + long long system; + long long idle; + long long iowait; + long long irq; + long long softirq; + long long steal; + long long guest; + long long guest_nice; +} CpuTime; + +// 从 /proc/stat 文件中读取CPU时间片 +int readCpuTime(CpuTime *result) { + FILE *fp; + char buffer[1024]; + char cpu[5]; + fp = fopen("/proc/stat", "r"); + if (fp == NULL) { + perror("Failed to open /proc/stat"); + return -1; + } + if (fgets(buffer, sizeof(buffer), fp) == NULL) { + perror("Failed to read /proc/stat"); + fclose(fp); + return -1; + } + fclose(fp); + sscanf(buffer, "%s %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld", + cpu, + &result->user, + &result->nice, + &result->system, + &result->idle, + &result->iowait, + &result->irq, + &result->softirq, + &result->steal, + &result->guest, + &result->guest_nice); + return 0; +} + +double calculateCpuUsage(const CpuTime *start, const CpuTime *end) { + long long idle_diff = end->idle - start->idle; + long long total_diff = (end->user + end->nice + end->system + end->idle + end->iowait + end->irq + end->softirq + end->steal) + - (start->user + start->nice + start->system + start->idle + start->iowait + start->irq + start->softirq + start->steal); + if (total_diff == 0) return 0.0; + return (1.0 - ((double)idle_diff / total_diff)) * 100.0; +} + +int cpuUsed() { + double usePercent; + uint32_t disColor; + + CpuTime start, end; + + // 读取第一次CPU时间 + if (readCpuTime(&start) != 0) { + return EXIT_FAILURE; + } + + // 等待一秒 + sleep(1); + + // 读取第二次CPU时间 + if (readCpuTime(&end) != 0) { + return EXIT_FAILURE; + } + + usePercent = calculateCpuUsage(&start, &end); + if (usePercent < 75) { + disColor = DISP_COLOR_GREEN; + } else if (usePercent < 90) { + disColor = DISP_COLOR_YELLOW; + } else { + disColor = DISP_COLOR_RED; + } + // 计算并打印CPU使用率 + // printf("CPU Usage: %.2f%%", calculateCpuUsage(&start, &end)); + printf("#[bg=#3e4452]U:#[fg=#%x,bg=#3e4452]%.2f\%#[fg=#aab2bf,bg=#3e4452]", + disColor,usePercent); + + return EXIT_SUCCESS; +} + +int memUsed() { + int usePercent; + float memDisp; + uint32_t disColor; + + MemoryInfo memInfo = getMemoryInfo(); + + // printf("Total Memory: %lld kB\n", memInfo.totalMem); + // printf("Free Memory: %lld kB\n", memInfo.freeMem); + // // 计算已使用的内存大小 + // printf("Used Memory: %lld kB\n", memInfo.totalMem - memInfo.freeMem); + disColor = 0x98c379; + usePercent = 10000 - 10000*memInfo.freeMem/memInfo.totalMem; + if (usePercent < 7500) { + disColor = DISP_COLOR_GREEN; + } else if (usePercent < 9000) { + disColor = DISP_COLOR_YELLOW; + } else { + disColor = DISP_COLOR_RED; + } + + memDisp = 12.3; + memDisp = usePercent/100.0; + printf(" #[bg=#3e4452]M:#[fg=#%x,bg=#3e4452]%.2f\%#[fg=#aab2bf,bg=#3e4452]  #[default]", + disColor,memDisp); + return 0; +} + +int loadavgStat() +{ + double loadavg[3]; + uint32_t disColor[3]; + int itemCnt; + + long nprocs = -1; + // long nprocs_max = -1; + + nprocs = sysconf(_SC_NPROCESSORS_ONLN); + // nprocs_max = sysconf(_SC_NPROCESSORS_CONF); + + if (nprocs < 1) { + fprintf(stderr, "Could not determine number of CPUs online:\n"); + // return 1; + // } else if (nprocs_max < 1) { + // fprintf(stderr, "Could not determine number of CPUs configured:\n"); + // // return 1; + } + + // printf("Number of CPUs online: %ld\n", nprocs); + // printf("Number of CPUs configured: %ld\n", nprocs_max); + + // 读取负载均衡值 + if (getloadavg(loadavg, 3) == -1) { + perror("loadavgNG"); + return 1; + } + + itemCnt = 0; + while (itemCnt < sizeof(loadavg)/sizeof(loadavg[0])) { + loadavg[itemCnt] = loadavg[itemCnt]/nprocs; + if (loadavg[itemCnt] < 0.75) { + disColor[itemCnt] = DISP_COLOR_GREEN; + } else if (loadavg[itemCnt] < 0.9) { + disColor[itemCnt] = DISP_COLOR_YELLOW; + } else { + disColor[itemCnt] = DISP_COLOR_RED; + } + itemCnt++; + } + // 打印1分钟、5分钟和15分钟的负载均衡值 + // printf("1 minute load average: %.2f\n", loadavg[0]); + // printf("5 minute load average: %.2f\n", loadavg[1]); + // printf("15 minute load average: %.2f\n", loadavg[2]); + printf("#[fg=#%x,bg=#3e4452]%.2f \ +#[default]#[fg=#%x,bg=#3e4452]%.2f \ +#[default]#[fg=#%x,bg=#3e4452]%.2f \ +#[default]#[bg=#3e4452]", + disColor[0],loadavg[0], + disColor[1],loadavg[1], + disColor[2],loadavg[2]); + return 0; +} + +int main(int argc, char *argv[]) +{ + cpuUsed(); + memUsed(); + loadavgStat(); + return 0; +} + + + + diff --git a/sysstat.tmux b/sysstat.tmux index 65efede..094bbb3 100755 --- a/sysstat.tmux +++ b/sysstat.tmux @@ -11,10 +11,7 @@ placeholders=( ) commands=( - "#($CURRENT_DIR/scripts/cpu.sh)" - "#($CURRENT_DIR/scripts/mem.sh)" - "#($CURRENT_DIR/scripts/swap.sh)" - "#($CURRENT_DIR/scripts/loadavg.sh)" + "#($CURRENT_DIR/scripts/tmux_sysstat)" ) do_interpolation() { From a5df7302cf6ee902a4f374f552c39a7d8edd025b Mon Sep 17 00:00:00 2001 From: lijin Date: Wed, 9 Oct 2024 14:45:32 +0800 Subject: [PATCH 18/19] fix tmux plugin load --- scripts/helpers.sh | 112 +++++++++++++++++++++++++++++++++++++++++++++ sysstat.tmux | 3 -- 2 files changed, 112 insertions(+), 3 deletions(-) create mode 100755 scripts/helpers.sh diff --git a/scripts/helpers.sh b/scripts/helpers.sh new file mode 100755 index 0000000..fd8568c --- /dev/null +++ b/scripts/helpers.sh @@ -0,0 +1,112 @@ + +sysstat_color_map=( + 5fff00 + 87ff00 + afff00 + d7ff00 + ffff00 + ffd700 + ffaf00 + ff8700 + ff5f00 + d70000 + ff0000 +) + +get_tmux_option() { + local option="$1" + local default_value="$2" + local option_value="$(tmux show-option -gqv "$option")" + if [ -z "$option_value" ]; then + echo "$default_value" + else + echo "$option_value" + fi +} + +set_tmux_option() { + local option="$1" + local value="$2" + tmux set-option -gq "$option" "$value" +} + +get_tmux_option_ex() { + local option=$1 + local default_value=$2 + local force_icon=$3 + if [[ $force_icon == "force" ]]; then + local option_value=$(tmux show-option -gqv "$option") + if [[ $option_value != $default_value ]]; then + set_tmux_option "$option" "$default_value" + fi + fi + local option_value=$(tmux show-option -gqv "$option") + if [[ $force_icon == "custom" ]]; then + echo "$default_value" + elif [[ $force_icon == "force" ]]; then + echo "$option_value" + elif [[ $option_value != "" ]]; then + echo "$option_value" + else + echo "$default_value" + # echo "$option_value" + fi +} +is_osx() { + [ $(uname) == "Darwin" ] +} + +is_linux(){ + [ $(uname -s) == "Linux" ] +} + +is_freebsd() { + [ $(uname) == FreeBSD ] +} + +command_exists() { + local command="$1" + type "$command" >/dev/null 2>&1 +} + +# because bash does not support floating-point math +# but awk does +calc() { + local stdin; + read -d '' -u 0 stdin; + awk "BEGIN { print $stdin }"; +} + +# "<" math operator which works with floats, once again based on awk +fcomp() { + awk -v n1="$1" -v n2="$2" 'BEGIN {if (n1 Date: Wed, 9 Oct 2024 14:59:14 +0800 Subject: [PATCH 19/19] fix mem size calc --- Makefile | 8 ++++++++ scripts/Makefile | 8 -------- scripts/sysstat.cpp | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 Makefile delete mode 100644 scripts/Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..271c8d8 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ + + +all: + $(CXX) scripts/sysstat.cpp -o scripts/tmux_sysstat + + +clean: + rm -rf tmux_sysstat diff --git a/scripts/Makefile b/scripts/Makefile deleted file mode 100644 index ad00546..0000000 --- a/scripts/Makefile +++ /dev/null @@ -1,8 +0,0 @@ - - -all: - $(CXX) sysstat.cpp -o tmux_sysstat - - -clean: - rm -rf tmux_sysstat diff --git a/scripts/sysstat.cpp b/scripts/sysstat.cpp index 89b6c67..539364a 100644 --- a/scripts/sysstat.cpp +++ b/scripts/sysstat.cpp @@ -50,7 +50,7 @@ MemoryInfo getMemoryInfo() { if (sscanf(line, "MemTotal: %lld kB", &value) == 1) { memInfo.totalMem = value; } - if (sscanf(line, "MemFree: %lld kB", &value) == 1) { + if (sscanf(line, "MemAvailable: %lld kB", &value) == 1) { memInfo.freeMem = value; } // 如果还需要其他内存信息,可以在这里继续添加解析代码