From c32bbf335d4af02ed1b8a4c46b748bcf757595f4 Mon Sep 17 00:00:00 2001 From: wukong Date: Mon, 12 Jan 2026 16:28:14 -0800 Subject: added uname case for 'Darwin'; added seconds case for ck_uptime(); completed ck_time() function to allow different commands for checking time; reverted t_meas estimation to basic subtraction method; adjusted sleep timer from mod 30 to mod 60 in ckt0.sh; --- ckt0.awk | 46 +++++++++++++++++++++++++++++++--------------- ckt0.sh | 12 ++++++------ 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/ckt0.awk b/ckt0.awk index 325fe40..68dd358 100644 --- a/ckt0.awk +++ b/ckt0.awk @@ -8,6 +8,10 @@ function log10(n) { function merge_meas(est_val, est_unc, meas_val, meas_unc) { + # add sanity (staleness) check on previous estimate + #z_est = (meas_val - est_val)/est_unc + #z_meas = (meas_val - est_val)/meas_unc + # Kalman filtering compares variances, # convert uncertainties to square units est_unc = (0.5*est_unc)^2.0 @@ -58,7 +62,7 @@ function ck_boottime(unm) { t0_k = mktime(t0_k) } - if (unm ~/FreeBSD/) { + if (unm ~/FreeBSD/ || unm ~/Darwin/) { "sysctl kern.boottime" | getline t0_k close("sysctl kern.boottime") sub("^.*{", "", t0_k) @@ -71,7 +75,7 @@ function ck_boottime(unm) { } - t0_k_unc = systime() + t0_k_unc = ck_time(unm) return sprintf("%s %s", t0_k, t0_k_unc) @@ -81,20 +85,24 @@ function ck_boottime(unm) { function ck_time(unm) { if (unm ~/FreeBSD/) { - #t = systime() "date +%s.%N" | getline t close("date +%s.%N") } + #if (unm ~/Darwin/) { else { - t = systime() + "date +%s" | getline t + close("date +%s") } + #else { + # t = systime() + #} return t } -function ck_uptime() { +function ck_uptime(unm) { # check uptime cmd "uptime" | getline t_up_cmd @@ -102,7 +110,7 @@ function ck_uptime() { # evaluate measured uptime t_up_meas[1] = 0.0 - t_up_meas[2] = systime() + t_up_meas[2] = ck_time(unm) sub("^.*up ", "", t_up_cmd) sub(", load.*$", "", t_up_cmd) @@ -129,6 +137,12 @@ function ck_uptime() { (t_up_meas[2] > 60.0) ? t_up_meas[2] = 60.0 : t_up_meas[2] += 0.0 } + if (t_up_cmd_arr[i] ~ /sec/) { + split(t_up_cmd_arr[i], sec) + t_up_meas[1] += sec[1] + (t_up_meas[2] > 1.0) ? t_up_meas[2] = 1.0 : t_up_meas[2] += 0.0 + } + if (t_up_cmd_arr[i] ~ /:/) { split(t_up_cmd_arr[i], hrs_min, ":") t_up_meas[1] += 3600.0*(hrs_min[1] + 0.0) @@ -156,9 +170,9 @@ BEGIN { # check ARGV for previous estimates if (ARGC) { ARGV[1] ? t_prev[1] = ARGV[1] : t_prev[1] = 0.0 - ARGV[2] ? t_prev[2] = ARGV[2] : t_prev[2] = systime() + ARGV[2] ? t_prev[2] = ARGV[2] : t_prev[2] = ck_time(uname) ARGV[3] ? t_up_prev[1] = ARGV[3] : t_up_prev[1] = 0.0 - ARGV[4] ? t_up_prev[2] = ARGV[4] : t_up_prev[2] = systime() + ARGV[4] ? t_up_prev[2] = ARGV[4] : t_up_prev[2] = ck_time(uname) ARGV[5] ? t0_prev[1] = ARGV[5] : split(ck_boottime(uname), t0_prev) ARGV[6] ? t0_prev[2] = ARGV[6] : split(ck_boottime(uname), t0_prev) } @@ -169,11 +183,11 @@ BEGIN { t_meas[2] = ck_time(uname) # convert to [val, unc] vector - if ( t_meas[1] != t_meas[2] ) { - t_meas[2] -= t_meas[1] - t_meas[1] += 0.5*t_meas[2] - } else { - split(merge_meas(t_meas[1], 1.0, t_meas[2], 1.0), t_meas) + t_meas[2] -= t_meas[1] + t_meas[1] += 0.5*t_meas[2] + if ( t_meas[2] == 0.0 ) { + #split(merge_meas(t_meas[1], 1.0, t_meas[2], 1.0), t_meas) + t_meas[2] = sqrt(t_meas[2]^2.0 + 1.0^2.0) } t_meas_str = sigfig(t_meas[1], t_meas[2]) @@ -185,10 +199,11 @@ BEGIN { t_up_est[1] = t_up_prev[1] + dt[1] t_up_est[2] = t_up_prev[2] + dt[2] t_up_est[2] += sqrt((t_up_est[1] - t_up_prev[1] - dt[1])^2.0) + t_up_prev[2] += sqrt((t_up_est[1] - t_up_prev[1] - dt[1])^2.0) # alt. prediction based on t0 - t_up_alt[1] = t_meas[1] - t0_prev[1] - t_up_alt[2] = t_meas[2] + t0_prev[2] + # t_up_alt[1] = t_meas[1] - t0_prev[1] + # t_up_alt[2] = t_meas[2] + t0_prev[2] # dt_up_alt # dt_up_alt[1] = t_up_alt[1] - (t_prev[1] - t0_prev[1]) @@ -210,6 +225,7 @@ BEGIN { t0_est[1] = t_meas[1] - t_up_est[1] t0_est[2] = t_meas[2] + t_up_est[2] t0_est[2] += sqrt((t0_est[1] - t0_prev[1])^2.0) + t0_prev[2] += sqrt((t0_est[1] - t0_prev[1])^2.0) # merge previous and updated boot time, t0 split(merge_meas(t0_est[1], t0_est[2], t0_prev[1], t0_prev[2]), t0_est) diff --git a/ckt0.sh b/ckt0.sh index cf54ad0..2983881 100644 --- a/ckt0.sh +++ b/ckt0.sh @@ -8,7 +8,7 @@ set -e # raw input data #date +%s -#sysctl_t0_str=$( sysctl kern.boottime | mawk -F= '{print($NF)}' ) +#sysctl_t0_str=$( sysctl kern.boottime | awk -F= '{print($NF)}' ) #sysctl_t0=$( date -jf "%a %b %d %H:%M:%S %G" "${sysctl_t0_str}" +%s ) @@ -23,11 +23,11 @@ printf "n t_est t_unc t_up_est t_up_unc t0_est t0_unc\n" | column -t for N in $(seq 0 10080) ; do printf "${N} ${t0_est}\n" | column -t - t0_est=$( mawk -f ckt0.awk ${t0_est} | tail -n2 ) - #mawk -f ckt0.awk - #sleep $( mawk 'BEGIN {print(sqrt( rand()^2.0 + 1.0 ))}' ) - #sleep $( echo $t0_est | mawk '{print(sqrt( ((60.0*$4)/(60.0 + $4))^2.0 + rand()^2.0 ))}' ) - sleep $( echo $t0_est | mawk '{print( sqrt($2^2.0 + $4^2.0 + $6^2.0 + rand()^2.0)%30.0 )}' ) + t0_est=$( awk -f ckt0.awk ${t0_est} | tail -n2 ) + #awk -f ckt0.awk + #sleep $( awk 'BEGIN {print(sqrt( rand()^2.0 + 1.0 ))}' ) + #sleep $( echo $t0_est | awk '{print(sqrt( ((60.0*$4)/(60.0 + $4))^2.0 + rand()^2.0 ))}' ) + sleep $( echo $t0_est | awk '{print( sqrt($2^2.0 + $4^2.0 + $6^2.0 + rand()^2.0)%60.0 )}' ) done -- cgit v1.2.3