v0.8.24 Fix for freezes caused by read errors

pull/102/head v0.8.24
aristocratos 2020-05-04 19:36:41 +02:00
parent 2a54323759
commit 911aadc86a
2 changed files with 67 additions and 36 deletions

View File

@ -1,5 +1,9 @@
# Changelog # Changelog
## v0.8.24
* Fixed: Input error freezes, by changing from using "read" command to using "dd" for reading keyboard input.
## v0.8.23 ## v0.8.23
* Added: Support for Raspberry Pi cpu temperature reporting * Added: Support for Raspberry Pi cpu temperature reporting

99
bashtop
View File

@ -64,7 +64,7 @@ banner=(
"██╔══██╗██╔══██║╚════██║██╔══██║ ██║ ██║ ██║██╔═══╝ " "██╔══██╗██╔══██║╚════██║██╔══██║ ██║ ██║ ██║██╔═══╝ "
"██████╔╝██║ ██║███████║██║ ██║ ██║ ╚██████╔╝██║ " "██████╔╝██║ ██║███████║██║ ██║ ██║ ╚██████╔╝██║ "
"╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ") "╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ")
declare version="0.8.23" declare version="0.8.24"
declare banner_width=${#banner[0]} declare banner_width=${#banner[0]}
banner_colors=("#E62525" "#CD2121" "#B31D1D" "#9A1919" "#801414") banner_colors=("#E62525" "#CD2121" "#B31D1D" "#9A1919" "#801414")
@ -152,12 +152,13 @@ declare -a sorting=( "pid" "program" "arguments" "threads" "user" "memory" "cpu
declare -a pid_history detail_graph detail_history detail_mem_history declare -a pid_history detail_graph detail_history detail_mem_history
declare time_left timestamp_start timestamp_end timestamp_input_start timestamp_input_end time_string mem_out proc_misc prev_screen pause_screen filter input_to_filter declare time_left timestamp_start timestamp_end timestamp_input_start timestamp_input_end time_string mem_out proc_misc prev_screen pause_screen filter input_to_filter
declare no_epoch proc_det proc_misc2 sleeping=0 detail_mem_graph proc_det2 proc_out curled git_version has_iostat declare no_epoch proc_det proc_misc2 sleeping=0 detail_mem_graph proc_det2 proc_out curled git_version has_iostat
declare esc_character tab backspace sleepy late_update skip_process_draw winches quitting theme_int notifier declare esc_character tab backspace sleepy late_update skip_process_draw winches quitting theme_int notifier saved_stty
declare -a disks_free disks_total disks_name disks_free_percent disks_io saved_key themes declare -a disks_free disks_total disks_name disks_free_percent disks_io saved_key themes
printf -v esc_character "\u1b" printf -v esc_character "\u1b"
printf -v tab "\u09" printf -v tab "\u09"
printf -v backspace "\u7F" printf -v backspace "\u7F"
printf -v enter_key "\uA" #printf -v enter_key "\uA"
printf -v enter_key "\uD"
read tty_height tty_width < <(stty size) read tty_height tty_width < <(stty size)
@ -213,6 +214,7 @@ fi
init_() { #? Collect needed information and set options before startig main loop init_() { #? Collect needed information and set options before startig main loop
local i local i
#* Set terminal options, save and clear screen #* Set terminal options, save and clear screen
saved_stty="$(stty -g)"
tput smcup tput smcup
stty -echo stty -echo
tput civis tput civis
@ -444,6 +446,7 @@ quit_() { #? Clean exit
tput rmcup tput rmcup
stty echo stty echo
tput cnorm tput cnorm
stty "${saved_stty}"
#* Save any changed values to config file #* Save any changed values to config file
if [[ $config_file != "/dev/null" ]]; then if [[ $config_file != "/dev/null" ]]; then
@ -457,6 +460,7 @@ sleep_() { #? Restore terminal options, stop and send to background if caught SI
tput rmcup tput rmcup
stty echo stty echo
tput cnorm tput cnorm
stty "${saved_stty}"
kill -s SIGSTOP $$ kill -s SIGSTOP $$
} }
@ -2760,9 +2764,12 @@ menu_() { #? Shows the main menu overlay
get_ms timestamp_end get_ms timestamp_end
time_left=$((timestamp_start+update_ms-timestamp_end)) time_left=$((timestamp_start+update_ms-timestamp_end))
if ((time_left>1000)); then wait_string=1; time_left=$((time_left-1000)) # if ((time_left>1000)); then wait_string=1; time_left=$((time_left-1000))
elif ((time_left>1)); then printf -v wait_string ".%03d" "${time_left}"; time_left=0 # elif ((time_left>1)); then printf -v wait_string ".%03d" "${time_left}"; time_left=0
else wait_string="0.001"; time_left=0; fi # else wait_string="0.001"; time_left=0; fi
if ((time_left>1000)); then wait_string=10; time_left=$((time_left-1000))
elif ((time_left>100)); then wait_string=$((time_left/100)); time_left=0
else wait_string="0"; time_left=0; fi
get_key -v keypress -w ${wait_string} get_key -v keypress -w ${wait_string}
if [[ $(stty size) != "$tty_height $tty_width" ]]; then resized; fi if [[ $(stty size) != "$tty_height $tty_width" ]]; then resized; fi
@ -2785,7 +2792,7 @@ menu_() { #? Shows the main menu overlay
q|Q) quit_ ;; q|Q) quit_ ;;
esac esac
if ((time_left==0)); then get_ms timestamp_start; collect_and_draw; fi if ((time_left==0)) && [[ -z $keypress ]]; then get_ms timestamp_start; collect_and_draw; fi
if ((resized>=5)); then resized=0; fi if ((resized>=5)); then resized=0; fi
done done
@ -2877,9 +2884,13 @@ help_() { #? Shows the help overlay
get_ms timestamp_end get_ms timestamp_end
time_left=$((timestamp_start+update_ms-timestamp_end)) time_left=$((timestamp_start+update_ms-timestamp_end))
if ((time_left>1000)); then wait_string=1; time_left=$((time_left-1000)) # if ((time_left>1000)); then wait_string=1; time_left=$((time_left-1000))
elif ((time_left>0)); then printf -v wait_string ".%03d" "${time_left}"; time_left=0 # elif ((time_left>0)); then printf -v wait_string ".%03d" "${time_left}"; time_left=0
else wait_string="0.001"; time_left=0; fi # else wait_string="0.001"; time_left=0; fi
if ((time_left>1000)); then wait_string=10; time_left=$((time_left-1000))
elif ((time_left>100)); then wait_string=$((time_left/100)); time_left=0
else wait_string="0"; time_left=0; fi
get_key -v help_key -w "${wait_string}" get_key -v help_key -w "${wait_string}"
@ -3101,9 +3112,13 @@ options_() { #? Shows the options overlay
get_ms timestamp_end get_ms timestamp_end
if [[ -z $theme_check ]]; then time_left=$((timestamp_start+update_ms-timestamp_end)) if [[ -z $theme_check ]]; then time_left=$((timestamp_start+update_ms-timestamp_end))
else unset theme_check; time_left=0; fi else unset theme_check; time_left=0; fi
if ((time_left>500)); then wait_string=0.5 # if ((time_left>500)); then wait_string=0.5
elif ((time_left>0)); then printf -v wait_string ".%03d" "${time_left}" # elif ((time_left>0)); then printf -v wait_string ".%03d" "${time_left}"
else wait_string="0.001"; time_left=0; fi # else wait_string="0.001"; time_left=0; fi
if ((time_left>500)); then wait_string=5; time_left=$((time_left-500))
elif ((time_left>100)); then wait_string=$((time_left/100)); time_left=0
else wait_string="0"; time_left=0; fi
get_key -v keypress -w ${wait_string} get_key -v keypress -w ${wait_string}
@ -3306,9 +3321,13 @@ killer_() { #? Kill process with selected signal
get_ms timestamp_end get_ms timestamp_end
time_left=$((timestamp_start+update_ms-timestamp_end)) time_left=$((timestamp_start+update_ms-timestamp_end))
if ((time_left>1000)); then wait_string=1; time_left=$((time_left-1000)) # if ((time_left>1000)); then wait_string=1; time_left=$((time_left-1000))
elif ((time_left>1)); then printf -v wait_string ".%03d" "${time_left}"; time_left=0 # elif ((time_left>1)); then printf -v wait_string ".%03d" "${time_left}"; time_left=0
else wait_string="0.001"; time_left=0; fi # else wait_string="0.001"; time_left=0; fi
if ((time_left>1000)); then wait_string=10; time_left=$((time_left-1000))
elif ((time_left>100)); then wait_string=$((time_left/100)); time_left=0
else wait_string="0"; time_left=0; fi
get_key -v keypress -w ${wait_string} get_key -v keypress -w ${wait_string}
if [[ $(stty size) != "$tty_height $tty_width" ]]; then resized; fi if [[ $(stty size) != "$tty_height $tty_width" ]]; then resized; fi
@ -3373,7 +3392,8 @@ get_key() { #? Get one key from standard input and translate key code to readabl
if [[ -z $save && -n ${saved_key[0]} ]]; then key="${saved_key[0]}"; unset 'saved_key[0]'; saved_key=("${saved_key[@]}") if [[ -z $save && -n ${saved_key[0]} ]]; then key="${saved_key[0]}"; unset 'saved_key[0]'; saved_key=("${saved_key[@]}")
else else
unset key unset key
IFS= read -rsd '' -t ${wait_time:-0.001} -n 1 key 2>/dev/null ||true #IFS= read -rsd '' -t ${wait_time:-0.001} -n 1 key 2>/dev/null ||true
key=$(stty -cooked min 0 time ${wait_time:-0}; dd bs=1 count=1 2>/dev/null)
if [[ -z ${key:+s} ]]; then if [[ -z ${key:+s} ]]; then
key_out="" key_out=""
@ -3385,25 +3405,26 @@ get_key() { #? Get one key from standard input and translate key code to readabl
if [[ $key == "${enter_key}" ]]; then key="enter" if [[ $key == "${enter_key}" ]]; then key="enter"
elif [[ $key == "${backspace}" ]]; then key="backspace" elif [[ $key == "${backspace}" ]]; then key="backspace"
elif [[ $key == "${tab}" ]]; then key="tab" elif [[ $key == "${tab}" ]]; then key="tab"
elif [[ $key == "$esc_character" ]]; then esc=1; read -rsn3 -t 0.001 key 2>/dev/null || true; fi elif [[ $key == "$esc_character" ]]; then
esc=1; key=$(stty -cooked min 0 time 0; dd bs=1 count=3 2>/dev/null); fi # read -rsn3 -t 0.001 key 2>/dev/null || true
if [[ -z $key && $esc -eq 1 ]]; then key="escape" if [[ -z $key && $esc -eq 1 ]]; then key="escape"
elif [[ $esc -eq 1 ]]; then elif [[ $esc -eq 1 ]]; then
case "${key}" in case "${key}" in
'[A') key="up" ;; '[A'*) key="up" ;;
'[B') key="down" ;; '[B'*) key="down" ;;
'[D') key="left" ;; '[D'*) key="left" ;;
'[C') key="right" ;; '[C'*) key="right" ;;
'[2~') key="insert" ;; '[2~') key="insert" ;;
'[3~') key="delete" ;; '[3~') key="delete" ;;
'[H') key="home" ;; '[H'*) key="home" ;;
'[F') key="end" ;; '[F'*) key="end" ;;
'[5~') key="page_up" ;; '[5~') key="page_up" ;;
'[6~') key="page_down" ;; '[6~') key="page_down" ;;
'[Z') key="shift_tab" ;; '[Z'*) key="shift_tab" ;;
'OP') key="f1";; 'OP'*) key="f1";;
'OQ') key="f2";; 'OQ'*) key="f2";;
'OR') key="f3";; 'OR'*) key="f3";;
'OS') key="f4";; 'OS'*) key="f4";;
'[15') key="f5";; '[15') key="f5";;
'[17') key="f6";; '[17') key="f6";;
'[18') key="f7";; '[18') key="f7";;
@ -3418,7 +3439,8 @@ get_key() { #? Get one key from standard input and translate key code to readabl
fi fi
read -rst 0.001 -n 1000 2>/dev/null ||true #read -rst 0.001 -n 1000 2>/dev/null ||true
stty -cooked min 0 time 0; dd bs=512 count=1 >/dev/null 2>&1
if [[ -n $save && -n $key ]]; then saved_key+=("${key}"); return 0; fi if [[ -n $save && -n $key ]]; then saved_key+=("${key}"); return 0; fi
@ -3594,7 +3616,7 @@ collect_and_draw() { #? Run all collect and draw functions
elif [[ -z $pause_screen ]]; then elif [[ -z $pause_screen ]]; then
input_runs=0 input_runs=0
while [[ -n ${saved_key[0]} ]] && ((time_left>0)) && ((++input_runs<=5)); do while [[ -n ${saved_key[0]} ]] && ((time_left>0)) && ((++input_runs<=5)); do
process_input 0.001 process_input
unset late_update unset late_update
done done
fi fi
@ -3651,17 +3673,22 @@ main_loop() { #? main loop...
#* If NOT waiting for input and time left is greater than 500ms, wait 500ms and loop #* If NOT waiting for input and time left is greater than 500ms, wait 500ms and loop
if [[ -z $input_to_filter ]] && ((time_left>=500)); then if [[ -z $input_to_filter ]] && ((time_left>=500)); then
wait_string="0.5" # wait_string="0.5"
wait_string="5"
time_left=$((time_left-500)) time_left=$((time_left-500))
#* If waiting for input and time left is greater than "50 ms", wait 50ms and loop #* If waiting for input and time left is greater than "50 ms", wait 50ms and loop
elif [[ -n $input_to_filter ]] && ((time_left>=50)); then # elif [[ -n $input_to_filter ]] && ((time_left>=50)); then
wait_string="0.05" # wait_string="0.05"
time_left=$((time_left-50)) # time_left=$((time_left-50))
elif [[ -n $input_to_filter ]] && ((time_left>=100)); then
wait_string="1"
time_left=$((time_left-100))
#* Else format wait string with padded zeroes if needed and break loop #* Else format wait string with padded zeroes if needed and break loop
else else
printf -v wait_string ".%03d" "${time_left}" #printf -v wait_string ".%03d" "${time_left}"
if ((time_left>=100)); then wait_string=$((time_left/100)); else wait_string=0; fi
time_left=0 time_left=0
fi fi