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.
This commit is contained in:
parent
74a967eb10
commit
aaa4cd251d
|
@ -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
|
||||
(
|
||||
while true;do
|
||||
_poll || exit $?
|
||||
(( ONCE )) && EXITING=1
|
||||
|
||||
$watch_cmd | while ! (( EXITING ));do
|
||||
sleep $RATE_LIMIT
|
||||
(( ONCE )) && exit 0
|
||||
|
||||
$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 -t $( echo "$POLL_INTERVAL - $RATE_LIMIT + .5 " | bc );then
|
||||
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; N=$((N + 1));done
|
||||
while read -t 0;do read -r; 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
|
||||
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" "$@")"
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user