From aaa4cd251dd5abf51c96e9330e7665346c5441e5 Mon Sep 17 00:00:00 2001 From: James Andariese Date: Sat, 30 Mar 2024 16:03:17 -0500 Subject: [PATCH] fix issues with track_anything.sh args were broken due to shift and other problems -1 didn't work because of the subshell output filtering didn't work with uniq. this was resolved by adding an unbuf function which uses stdbuf to fix buffering. --- scripts/track_anything.sh | 67 ++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/scripts/track_anything.sh b/scripts/track_anything.sh index 300c62c..d80689e 100644 --- a/scripts/track_anything.sh +++ b/scripts/track_anything.sh @@ -1,11 +1,12 @@ +# shellcheck shell=bash + export ZERO="$0" HELP="$ZERO: tracker [-1] [-v [-v ...]] [q [-q ...]] -1 run once and exit -v increase verbosity (default >= warn) -q decrease verbosity " -EXITING=0 -trap 'EXITING=1' INT +trap 'kill -15 $$' INT trace() { (( LOG_LEVEL > 2 )) && (exec 1>&2; builtin echo "$@"|grep .||true); } debug() { (( LOG_LEVEL > 1 )) && (exec 1>&2; builtin echo "$@"|grep .||true); } @@ -15,6 +16,8 @@ error() { (( LOG_LEVEL > -2 )) && (exec 1>&2; builtin echo "$@"|grep .||true); } fatal() { (exec 1>&2; builtin echo "$@"|grep .||true); exit 4; } log() { info "$@"; } +unbuf() { SCRIPT="$1"; shift ; stdbuf -oL -eL bash -c "$SCRIPT" - "$@" ; } + start() { if ! options="$(getopt vq1 -- "$@")";then fatal "$HELP" @@ -24,17 +27,18 @@ start() { while [ $# -gt 0 ];do case "$1" in - -1) shift;ONCE=1 ;; - -h) echo "requesting help" ; help; exit 0 ;; - -v) LOG_LEVEL=$(( LOG_LEVEL + 1 )) ;echo increased log level ;; + -1) ONCE=1 ;; + -h) info "$HELP"; exit 0 ;; + -v) LOG_LEVEL=$(( LOG_LEVEL + 1 )) ;; -q) LOG_LEVEL=$(( LOG_LEVEL - 1 )) ;; --) shift;break;; # we're _explicitly_ done with options + -*) error "invalid option $1"; fatal "$HELP" ;; *) break;; # we're done with options. esac shift done - if [ $VALIDATION ];then + if [ "$VALIDATION" ];then # fix up the validation regex to not search. VALIDATION="${VALIDATION#^}" VALIDATION="${VALIDATION%'$'}" @@ -48,36 +52,33 @@ start() { debug "POLL_INTERVAL: $POLL_INTERVAL" debug " watch_cmd: $watch_cmd" - if [ $(echo "$POLL_INTERVAL < $RATE_LIMIT"|bc) -eq 1 ];then + if [ "$(echo "$POLL_INTERVAL < $RATE_LIMIT"|bc)" = 1 ];then warn "POLL_INTERVAL cannot be less than RATE_LIMIT." info "increasing POLL_INTERVAL to $RATE_LIMIT." POLL_INTERVAL=$RATE_LIMIT fi - while ! (( EXITING ));do - ( - _poll || exit $? - (( ONCE )) && EXITING=1 + while true;do + _poll || exit $? + (( ONCE )) && exit 0 - $watch_cmd | while ! (( EXITING ));do - sleep $RATE_LIMIT - - # read with a maximum of the poll interval minus the previous rate limit. - # rounding _up_ to the nearest second. (bc floors when scale is unset.) - if read -t $( echo "$POLL_INTERVAL - $RATE_LIMIT + .5 " | bc );then - debug "received poll. removing other poll requests." - else - debug "reached the polling interval. forcing poll." - fi - N=0 - while read -t 0;do read; N=$((N + 1));done - debug "removed $N extra events" - _poll - debug "sleeping for $RATE_LIMIT" - done - ) | eval "$_filter" - (( EXITING == 0 )) && (warn "tracker died. restarting after $RATE_LIMIT seconds.";sleep $RATE_LIMIT) - done + $watch_cmd | while sleep $RATE_LIMIT;do + # read with a maximum of the poll interval minus the previous rate limit. + # rounding _up_ to the nearest second. (bc floors when scale is unset.) + if read -r -t "$( echo "$POLL_INTERVAL - $RATE_LIMIT + .5 " | bc )";then + debug "received poll. removing other poll requests." + else + debug "reached the polling interval. forcing poll." + fi + N=0 + while read -t 0;do read -r; N=$((N + 1));done + debug "removed $N extra events" + _poll + debug "sleeping for $RATE_LIMIT" + done + warn "tracker died. restarting after $RATE_LIMIT seconds." + sleep $RATE_LIMIT + done | unbuf "$_filter" info "bye" } @@ -90,10 +91,10 @@ _poll() { done local failed=0 - if [ $JQ_VALIDATION ];then + if [ "$JQ_VALIDATION" ];then echo "$NEWVAL" | jq -e "$JQ_VALIDATION" > /dev/null || failed=1 fi - if [ $VALIDATION ];then + if [ "$VALIDATION" ];then echo "$NEWVAL" | grep -qE "$VALIDATION" || failed=1 fi if (( failed ));then @@ -115,7 +116,7 @@ poll_interval() { POLL_INTERVAL=$1 } -_filter=uniq +_filter="uniq" filter() { _filter="$(printf " %q" "$@")" }