added a new label on the menu to allow the user to take advantage of the latest updates and make a quick upgrade
the button will be available only if a recent version is published and allows more autonomy for the user On branch core_contrib Changes to be committed: new file: .gitignore renamed: logo-t.png -> Imgs/logo-t.png renamed: main.png -> Imgs/main.png renamed: menu.png -> Imgs/menu.png renamed: options.png -> Imgs/options.png modified: README.md modified: bashtoppull/78/head
|
@ -0,0 +1,2 @@
|
|||
DEB/bashtop_*
|
||||
DEB/usr/*
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.4 KiB |
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 147 KiB |
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 109 KiB |
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 119 KiB |
16
README.md
|
@ -1,7 +1,9 @@
|
|||
# 
|
||||
# 
|
||||
|
||||
**Usage:** Linux resource monitor
|
||||
**Language:** Bash
|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
## Index
|
||||
|
||||
|
@ -9,7 +11,7 @@
|
|||
* [Description](#description)
|
||||
* [Features](#features)
|
||||
* [Themes](#themes)
|
||||
* [Upcoming](#upcoming-(osx-and-bsd-support))
|
||||
* [Upcoming](#upcoming-(osx-and-bsd-support)
|
||||
* [Support and funding](#support-and-funding) (Updated)
|
||||
* [Compatibility](#compatibility) (Updated)
|
||||
* [Dependencies](#dependencies)
|
||||
|
@ -100,13 +102,13 @@ Bash version 5 is highly recommended to make use of $EPOCHREALTIME variable inst
|
|||
## Screenshots
|
||||
|
||||
Main UI showing details for a selected process.
|
||||

|
||||

|
||||
|
||||
Main menu.
|
||||

|
||||

|
||||
|
||||
Options menu.
|
||||

|
||||

|
||||
|
||||
## Installation
|
||||
|
||||
|
|
171
bashtop
|
@ -44,7 +44,7 @@ if [[ "$system" != "Linux" ]]; then
|
|||
fi
|
||||
|
||||
#* Fail if Bash version is below 4.4
|
||||
bash_version_major="$(echo $BASH_VERSION | cut -d "." -f 1)"
|
||||
bash_version_major="$(echo $BASH_VERSINFO)"
|
||||
bash_version_minor="$(echo $BASH_VERSION | cut -d "." -f 2)"
|
||||
if [[ "$bash_version_major" -lt 4 ]] || [[ "$bash_version_major" == 4 && "$bash_version_minor" -lt 4 ]]; then
|
||||
echo "ERROR: Bash 4.4 or later is required (you are using Bash $bash_version_major.$bash_version_minor)."
|
||||
|
@ -64,7 +64,7 @@ banner=(
|
|||
"██╔══██╗██╔══██║╚════██║██╔══██║ ██║ ██║ ██║██╔═══╝ "
|
||||
"██████╔╝██║ ██║███████║██║ ██║ ██║ ╚██████╔╝██║ "
|
||||
"╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ")
|
||||
declare version="0.8.16"
|
||||
declare version="0.8.17"
|
||||
declare banner_width=${#banner[0]}
|
||||
banner_colors=("#E62525" "#CD2121" "#B31D1D" "#9A1919" "#801414")
|
||||
|
||||
|
@ -118,6 +118,11 @@ menu_quit=(
|
|||
"┌─┐ ┬ ┬ ┬┌┬┐"
|
||||
"│─┼┐│ │ │ │ "
|
||||
"└─┘└└─┘ ┴ ┴ ")
|
||||
menu_update=(
|
||||
"┬ ┬┌─┐┌┬┐┌─┐┌┬┐┌─┐"
|
||||
"│ │├─┘ ││├─┤ │ ├┤ "
|
||||
"└─┘┴ ─┴┘┴ ┴ ┴ └─┘"
|
||||
)
|
||||
|
||||
menu_options_selected=(
|
||||
"╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗"
|
||||
|
@ -132,6 +137,13 @@ menu_quit_selected=(
|
|||
"║═╬╗║ ║ ║ ║ "
|
||||
"╚═╝╚╚═╝ ╩ ╩ ")
|
||||
|
||||
menu_update_selected=(
|
||||
"*┬ ┬┌─┐┌┬┐┌─┐┌┬┐┌─┐"
|
||||
" │ │├─┘ ││├─┤ │ ├┤ "
|
||||
" └─┘┴ ─┴┘┴ ┴ ┴ └─┘"
|
||||
)
|
||||
|
||||
declare -r remote_src="https://raw.githubusercontent.com/aristocratos/bashtop/master/$(basename $0)"
|
||||
declare -A cpu mem swap proc net box theme
|
||||
declare -a cpu_usage cpu_graph_a cpu_graph_b color_meter color_temp_graph color_cpu color_cpu_graph cpu_history color_mem_graph color_swap_graph
|
||||
declare -a mem_history swap_history net_history_download net_history_upload mem_graph swap_graph proc_array download_graph upload_graph trace_array
|
||||
|
@ -144,6 +156,7 @@ declare time_left timestamp_start timestamp_end timestamp_input_start timestamp_
|
|||
declare no_epoch proc_det proc_misc2 sleeping=0 detail_mem_graph proc_det2 proc_out curled git_version
|
||||
declare esc_character tab backspace sleepy late_update skip_process_draw winches quitting theme_int
|
||||
declare -a disks_free disks_total disks_name disks_free_percent saved_key themes
|
||||
declare -a menus=("options" "help" "quit") color
|
||||
printf -v esc_character "\u1b"
|
||||
printf -v tab "\u09"
|
||||
printf -v backspace "\u7F"
|
||||
|
@ -226,6 +239,12 @@ init_() { #? Collect needed information and set options before startig main loop
|
|||
proc[pid_len]=${#proc[pid_max]}
|
||||
if [[ ${proc[pid_len]} -lt 5 ]]; then proc[pid_len]=5; fi
|
||||
|
||||
#* Wait for resize if terminal size is smaller then 80x24
|
||||
if (($tty_width<80 | $tty_height<24)); then resized; fi
|
||||
|
||||
#* Calculate sizes of boxes
|
||||
calc_sizes
|
||||
|
||||
#* Call init for cpu data collection
|
||||
collect_cpu init
|
||||
|
||||
|
@ -260,8 +279,13 @@ init_() { #? Collect needed information and set options before startig main loop
|
|||
((++y))
|
||||
done
|
||||
print -v banner_out[y] -rs -fg cc -b "← esc"
|
||||
if [[ -n $git_version && $git_version != "$version" ]]; then print -v banner_out[y] -rs -fg "#80cc80" -r 15 "[${git_version} available!]" -r $((9-${#git_version}))
|
||||
else print -v banner_out[y] -r 37; fi
|
||||
[[ -n $git_version && $git_version != "$version" ]] && {
|
||||
# toggle update label menu only if new version is available
|
||||
menus+=("update")
|
||||
print -v banner_out[y] -rs -fg "#80cc80" -r 15 "[${git_version} available!]" -r $((9-${#git_version}))
|
||||
}||{
|
||||
print -v banner_out[y] -r 37;
|
||||
}
|
||||
print -v banner_out[y] -fg cc -i -b "Version: ${version}" -rs
|
||||
unset 'banner[@]'
|
||||
banner=("${banner_out[@]}")
|
||||
|
@ -287,13 +311,6 @@ init_() { #? Collect needed information and set options before startig main loop
|
|||
unset 'proc[reverse]'
|
||||
fi
|
||||
|
||||
#* Wait for resize if terminal size is smaller then 80x25
|
||||
if (($tty_width<80 | $tty_height<25)); then resized; fi
|
||||
|
||||
#* Calculate sizes of boxes
|
||||
calc_sizes
|
||||
|
||||
|
||||
#* Call init for processes data collection
|
||||
proc[selected]=0
|
||||
proc[page]=1
|
||||
|
@ -426,6 +443,40 @@ quit_() { #? Clean exit
|
|||
exit 0
|
||||
}
|
||||
|
||||
update_ () { # update label menu to upgrade to new version
|
||||
|
||||
local -a root_binary_path=("/bin/" "/usr/bin/")
|
||||
local src=$(basename $0)
|
||||
local path
|
||||
|
||||
# the update menu is also availabe inside cloned repository
|
||||
# if bashtop is installed in the system the update menu will be also available
|
||||
#+ to get the lastest feature or new update version
|
||||
if [[ ! -d .git ]] ; then
|
||||
for xbin in ${root_binary_path[@]} ; do
|
||||
[[ -x ${xbin}${src} ]]&& path=${xbin}${src}
|
||||
done
|
||||
else
|
||||
path=${src}
|
||||
fi
|
||||
|
||||
[[ -n ${path} ]] && {
|
||||
curl ${remote_src} -o ${path}
|
||||
test $? -eq 0 && {
|
||||
[[ -x ${root_binary_path[1]}notify-send ]] && {
|
||||
notify-send --urgency=normal "${src} updated to v${version}"
|
||||
}
|
||||
# remove update label from the menu if it's in recent version
|
||||
unset 'menus[${#menus[@]}-1]'
|
||||
}|| {
|
||||
[[ -x ${root_binary_path[1]}notify-send ]] && {
|
||||
notify-send --urgency=critical "UPDATE FAILED : try to run as root to make update !"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sleep_() { #? Restore terminal options, stop and send to background if caught SIGTSTP (ctrl+z)
|
||||
tput rmcup
|
||||
stty echo
|
||||
|
@ -470,7 +521,7 @@ resized() { #? Get new terminal size if terminal is resized
|
|||
unset winches
|
||||
while ((++winches<5)); do
|
||||
read tty_height tty_width < <(stty size)
|
||||
if (($tty_width<80 | $tty_height<25)); then
|
||||
if (($tty_width<80 | $tty_height<24)); then
|
||||
size_error_msg
|
||||
winches=0
|
||||
else
|
||||
|
@ -488,7 +539,7 @@ size_error_msg() { #? Shows error message if terminal size is below 80x25
|
|||
tput clear
|
||||
create_box -full -lc "#EE2020" -title "resize window"
|
||||
print -rs -m $((tty_height/2-1)) 2 -fg ${theme[title]} -c -l 11 "Current size: " -bg "#00" -fg dd2020 -d 1 -c "${tty_width}x${tty_height}" -rs
|
||||
print -d 1 -fg ${theme[title]} -c -l 15 "Need to be atleast:" -bg "#00" -fg 30dd50 -d 1 -c "80x25" -rs
|
||||
print -d 1 -fg ${theme[title]} -c -l 15 "Need to be atleast:" -bg "#00" -fg 30dd50 -d 1 -c "80x24" -rs
|
||||
while [[ $(stty size) == "$tty_height $tty_width" ]]; do sleep 0.2; done
|
||||
|
||||
}
|
||||
|
@ -722,6 +773,8 @@ get_value() { #? Get a value from a file, variable or array by searching for a n
|
|||
shift
|
||||
done
|
||||
|
||||
found=""
|
||||
|
||||
if [[ -z $input ]]; then return 1; fi
|
||||
if [[ -z $line_nr && -z $key ]]; then line_nr=1; fi
|
||||
|
||||
|
@ -1404,28 +1457,71 @@ collect_cpu() { #? Collects cpu stats from /proc/stat and compares with previous
|
|||
}
|
||||
|
||||
collect_cpu_temps() { #? Collect cpu temperatures
|
||||
local unit i it c div threads=${cpu[threads]} sens_var
|
||||
local unit c div threads=${cpu[threads]} sens_var i it ccd_value breaking core_value
|
||||
local -a ccd_array core_array
|
||||
|
||||
#* Fetch output from "sensors" command to a variable
|
||||
sens_var="$(sensors)"
|
||||
|
||||
#* Get CPU package temp
|
||||
if get_value -v 'cpu[temp_0]' -sv "sens_var" -k "Package*:" -mk 1; then
|
||||
|
||||
#* If successful get temperature unit, convert temp to integer and get high, crit and core temps
|
||||
#* Get CPU package temp for intel cpus
|
||||
if get_value -v 'cpu[temp_0]' -sv "sens_var" -k "Package*:" -mk 1 || get_value -v 'cpu[temp_0]' -sv "sens_var" -k "Core 0:" -mk 1; then
|
||||
#* If successful get temperature unit, convert temp to integer and get high and crit
|
||||
cpu[temp_unit]=${cpu[temp_0]:(-2)}; cpu[temp_0]=${cpu[temp_0]%.*}; if [[ ${cpu[temp_0]::1} == "+" ]]; then cpu[temp_0]=${cpu[temp_0]#+}; fi
|
||||
if [[ -z ${cpu[temp_high]} ]]; then
|
||||
get_value -v 'cpu[temp_high]' -sv "sens_var" -k "Package*high =" -m 2 -r "[^0-9.]" -b -i
|
||||
get_value -v 'cpu[temp_crit]' -sv "sens_var" -k "Package*crit =" -m 2 -r "[^0-9.]" -b -i
|
||||
if ! get_value -v 'cpu[temp_high]' -sv "sens_var" -k "Package*high =" -m 2 -r "[^0-9.]" -b -i; then cpu[temp_high]="85"; cpu[temp_crit]=$((cpu[temp_high]+10))
|
||||
else get_value -v 'cpu[temp_crit]' -sv "sens_var" -k "Package*crit =" -m 2 -r "[^0-9.]" -b -i; fi
|
||||
fi
|
||||
for((i=0,it=1;i<threads;i++,it++)); do
|
||||
if ! get_value -v "cpu[temp_${it}]" -sv "sens_var" -k "Core ${i}:" -mk 1 -r "[^0-9.-]" -b -i; then break; fi
|
||||
#* If number of cores is less than number of threads copy current temp to "current core id"+"total cores"
|
||||
if ((cpu[cores]<cpu[threads])); then
|
||||
cpu[temp_$((it+cpu[cores]))]=${cpu[temp_${it}]}
|
||||
fi
|
||||
|
||||
#* Get core temps
|
||||
i=0
|
||||
while get_value -v "core_value" -sv "sens_var" -k "Core ${i}:" -mk 1 -r "[^0-9.]" -b -i; do core_array+=("$core_value"); ((++i)) ; done
|
||||
|
||||
if [[ -z ${core_array[0]} ]]; then core_array=("${cpu[temp_0]}"); fi
|
||||
|
||||
if ((${#core_array[@]}<threads/2)); then
|
||||
for((i=${#core_array[@]};i<threads/2;i++)); do
|
||||
core_array+=("${cpu[temp_0]}")
|
||||
done
|
||||
fi
|
||||
|
||||
#* Copy core values to hyperthreading cores
|
||||
i=1
|
||||
for core_value in "${core_array[@]}"; do
|
||||
cpu[temp_$((i))]="${core_value}"
|
||||
cpu[temp_$((threads/2+i))]="${core_value}"
|
||||
((i++))
|
||||
done
|
||||
|
||||
#* Get CPU package temp for amd ryzen cpus
|
||||
elif get_value -v 'cpu[temp_0]' -sv "sens_var" -k "Tdie:" -mk 1; then
|
||||
#* If successful get temperature unit, convert temp to integer and get high
|
||||
cpu[temp_unit]=${cpu[temp_0]:(-2)}; cpu[temp_0]=${cpu[temp_0]%.*}; if [[ ${cpu[temp_0]::1} == "+" ]]; then cpu[temp_0]=${cpu[temp_0]#+}; fi
|
||||
if [[ -z ${cpu[temp_high]} ]]; then
|
||||
if ! get_value -v 'cpu[temp_high]' -sv "sens_var" -k "Tdie*high =" -m 2 -r "[^0-9.]" -b -i; then cpu[temp_high]="85"; fi
|
||||
cpu[temp_crit]=$((cpu[temp_high]+10))
|
||||
fi
|
||||
|
||||
#* Get ccd module temps
|
||||
i=1
|
||||
while get_value -v "ccd_value" -sv "sens_var" -k "Tccd${i}:" -mk 1 -r "[^0-9.]" -b -i; do ccd_array+=("$ccd_value"); ((i++)) ; done
|
||||
|
||||
if [[ -z ${ccd_array[0]} ]]; then ccd_array=("${cpu[temp_0]}"); fi
|
||||
|
||||
#* Copy ccd values to cores in each ccd
|
||||
z=1
|
||||
for ccd_value in "${ccd_array[@]}"; do
|
||||
for((i=0;i<threads/${#ccd_array[@]};i++)); do
|
||||
cpu[temp_$((z+i))]="${ccd_value}"
|
||||
done
|
||||
z=$((z+i))
|
||||
done
|
||||
|
||||
#* If unsuccessful turn off temperature checking
|
||||
else
|
||||
check_temp="false"
|
||||
fi
|
||||
|
||||
if [[ $check_temp == true ]]; then
|
||||
for((i=0;i<=threads;i++)); do
|
||||
local -n cpu_temp_history="cpu_temp_history_$i"
|
||||
if ((${#cpu_temp_history[@]}>15)); then
|
||||
|
@ -1434,11 +1530,6 @@ collect_cpu_temps() { #? Collect cpu temperatures
|
|||
cpu_temp_history+=("$(( (${cpu[temp_${i}]}-15)*100/(cpu[temp_high]-15) ))")
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
#* If unsuccessful turn off temperature checking
|
||||
else
|
||||
check_temp="false"
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -1448,7 +1539,7 @@ collect_mem() { #? Collect memory information from "/proc/meminfo"
|
|||
if ((mem[counter]<5)); then return; fi
|
||||
mem[counter]=0
|
||||
|
||||
local i tmp value array mem_info
|
||||
local i tmp value array mem_info height=$((box[mem_height]-2))
|
||||
local -a mem_array swap_array available=("mem")
|
||||
|
||||
#* Get memory and swap information from "/proc/meminfo" and calculate percentages
|
||||
|
@ -1503,10 +1594,9 @@ collect_mem() { #? Collect memory information from "/proc/meminfo"
|
|||
disks_free+=("$(floating_humanizer -s 1 -B ${line_array[3]})")
|
||||
disks_free_percent+=("$((100-${line_array[4]%'%'}))")
|
||||
|
||||
if ((${#disks_name[@]}>=height/2)); then break; fi
|
||||
done
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
collect_processes() { #? Collect process information and calculate accurate cpu usage
|
||||
|
@ -2007,7 +2097,7 @@ draw_cpu() { #? Draw cpu and core graphs and print percentages
|
|||
|
||||
if [[ $check_temp == true ]]; then
|
||||
for((i=0;i<=threads;i++)); do
|
||||
create_mini_graph -o "cpu_temp_graph_$i" -w 5 -c color_temp_graph "cpu_temp_history_$i"
|
||||
if [[ -n ${cpu[temp_${i}]} ]]; then create_mini_graph -o "cpu_temp_graph_$i" -w 5 -c color_temp_graph "cpu_temp_history_$i"; fi
|
||||
done
|
||||
fi
|
||||
((resized++))
|
||||
|
@ -2023,8 +2113,10 @@ draw_cpu() { #? Draw cpu and core graphs and print percentages
|
|||
done
|
||||
if [[ $check_temp == true ]]; then
|
||||
for((i=0;i<=threads;i++)); do
|
||||
declare -n temp_hist="cpu_temp_history_${i}[-1]"
|
||||
create_mini_graph -w 5 -c color_temp_graph -add-value "cpu_temp_graph_$i" ${temp_hist}
|
||||
if [[ -n ${cpu[temp_${i}]} ]]; then
|
||||
declare -n temp_hist="cpu_temp_history_${i}[-1]"
|
||||
create_mini_graph -w 5 -c color_temp_graph -add-value "cpu_temp_graph_$i" ${temp_hist}
|
||||
fi
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
@ -2067,7 +2159,7 @@ draw_cpu() { #? Draw cpu and core graphs and print percentages
|
|||
|
||||
print -v cpu_out_var -m $((pt_line+y)) $pt_col -rs -fg $p_normal_color -jl 7 -t "$name" -fg ${theme[inactive_fg]} "⡀⡀⡀⡀⡀⡀⡀⡀⡀⡀" -l 10 -t "$meter"\
|
||||
-fg $cpu_p_color -jr 4 -t "${cpu_usage[i]}" -fg $p_normal_color -t "%"
|
||||
if [[ $check_temp == true ]]; then
|
||||
if [[ $check_temp == true && -n ${cpu[temp_${i}]} ]]; then
|
||||
print -v cpu_out_var -fg ${theme[inactive_fg]} " ⡀⡀⡀⡀⡀" -l 7 -t " ${!temp_name}" -fg $temp_color -jr 4 -t ${cpu[temp_${i}]} -fg $p_normal_color -t ${cpu[temp_unit]}
|
||||
fi
|
||||
|
||||
|
@ -2551,7 +2643,7 @@ unpause_() { #? Unpause
|
|||
|
||||
menu_() { #? Shows the main menu overlay
|
||||
local menu i count keypress selected_int=0 selected up local_rez d_banner=1 menu_out bannerd skipped menu_pause out_out wait_string trans
|
||||
local -a menus=("options" "help" "quit") color
|
||||
# local -a menus=("options" "help" "quit") color
|
||||
|
||||
until false; do
|
||||
|
||||
|
@ -2619,6 +2711,7 @@ menu_() { #? Shows the main menu overlay
|
|||
options) options_ ;;
|
||||
help) help_ ;;
|
||||
quit) quit_ ;;
|
||||
update)update_;;
|
||||
esac
|
||||
;;
|
||||
m|M|escape|backspace) break ;;
|
||||
|
|