diff options
| author | wukong <wukong@longaeva> | 2026-06-09 10:47:09 -0700 |
|---|---|---|
| committer | wukong <wukong@longaeva> | 2026-06-09 10:47:09 -0700 |
| commit | 7fb50be1944f3a76a285ac04423ae233728b5bf7 (patch) | |
| tree | 957548d230a9ab48eb80dac4d8ee5e493cbaea6d | |
| parent | 40548183b45666afc50373b0ee172465660fc479 (diff) | |
merge code between ckcptime and ckt0 scripts;
added btime check from /proc/stat in ckt0.awk;
Diffstat (limited to '')
| -rw-r--r-- | ckcptime.awk | 135 | ||||
| -rw-r--r-- | ckcptime.sh | 22 | ||||
| -rw-r--r-- | ckt0.awk | 13 | ||||
| -rw-r--r-- | ckt0.sh | 6 |
4 files changed, 142 insertions, 34 deletions
diff --git a/ckcptime.awk b/ckcptime.awk index 7bfef6e..a45e046 100644 --- a/ckcptime.awk +++ b/ckcptime.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 @@ -17,8 +21,9 @@ function merge_meas(est_val, est_unc, meas_val, meas_unc) { est_val = est_val + K*(meas_val - est_val) est_unc = (est_unc*meas_unc)/(est_unc + meas_unc) - # convert est_unc back to original units + # convert uncertainties back to original units est_unc = 2.0*sqrt(est_unc) + meas_unc = 2.0*sqrt(meas_unc) return sprintf(OFMT OFS OFMT ORS, est_val, est_unc) @@ -27,24 +32,38 @@ function merge_meas(est_val, est_unc, meas_val, meas_unc) { function sigfig(val, unc) { - ordmag_val = log10(val) - ordmag_unc = log10(unc) + omag_val = log10(val) + omag_unc = log10(unc) - ordmag_high = sqrt((ordmag_val)^2.0 + (ordmag_unc)^2.0) - ordmag_low = ((ordmag_val)^-1.0 + (ordmag_unc)^-1.0)^-1.0 - ordmag_range = ordmag_high - ordmag_low + omag_high = sqrt((omag_val)^2.0 + (omag_unc)^2.0) + omag_low = ((omag_val)^-1.0 + (omag_unc)^-1.0)^-1.0 - sigfig_unc = sprintf("%.f", sqrt((ordmag_range)^2.0 + 3.0^2.0)) - sigfig_val = sprintf("%.f", sqrt((ordmag_range)^2.0 + (sigfig_unc)^2.0 + 3.0^2.0)) + sfig_unc = sprintf("%.f", sqrt((omag_high - omag_low)^2.0 + 6.0^2.0)) + sfig_val = sprintf("%.f", sqrt(sfig_unc^2.0 + 9.0^2.0)) - ofmt_val = "%." sigfig_val "g" - ofmt_unc = "%." sigfig_unc "g" + ofmt_val = "%." sfig_val "g" + ofmt_unc = "%." sfig_unc "g" return sprintf(ofmt_val OFS ofmt_unc, val, unc) } +function unc_g(val) { + + # order of magnitude + omag_val = log10(val) + + # trim punctuation from val + sub("[eE].*$", "", val) + gsub("[.+-]", "", val) + omag_unc = sprintf("%d", omag_val - length(val) + 1.0) + + return sprintf("%g", 10.0^(omag_unc)) + +} + + function ck_cptime() { t_sys_meas[1] = systime() @@ -59,12 +78,28 @@ function ck_cptime() { gsub(",", OFS, cptime_cmd) #split(cptime_cmd, cptime_arr, ",") - return sprintf(OFMT OFS "%s", t_sys_meas[1], cptime_cmd) + return sprintf("%s", cptime_cmd) + +} + + +function ck_time(unm) { + + if (unm ~ /FreeBSD/ || unm ~ /Linux/) { + "date +%s.%N" | getline t + close("date +%s.%N") + } + else { + "date +%s" | getline t + close("date +%s") + } + + return t } -function ck_uptime() { +function ck_uptime(unm) { # check uptime cmd "uptime" | getline t_up_cmd @@ -72,57 +107,109 @@ 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("^[ ]*[0-9]:[0-9]*[ ]", "", t_up_cmd) + sub("^.* up ", "", t_up_cmd) sub(", load.*$", "", t_up_cmd) split(t_up_cmd, t_up_cmd_arr, ",") for (i in t_up_cmd_arr) { - # TODO: add cases for days, months, years, etc. if (t_up_cmd_arr[i] ~ /day/) { split(t_up_cmd_arr[i], days) - t_up_meas[1] += 86400.0*(days[1] + 0.0) - (t_up_meas[2] > 86400.0) ? t_up_meas[2] = 86400.0 : t_up_meas[2] += 0.0 + (days[1] + 0.0) ? t_up_meas[1] += 86400.0*(days[1] + 0.0) : t_up_meas[1] += 0.0 + (t_up_meas[2] + 0.0) > 86400.0 ? t_up_meas[2] = 86400.0 : t_up_meas[2] += 0.0 } if (t_up_cmd_arr[i] ~ /hr/) { split(t_up_cmd_arr[i], hrs) - t_up_meas[1] += 3600.0*(hrs[1] + 0.0) - (t_up_meas[2] > 3600.0) ? t_up_meas[2] = 3600.0 : t_up_meas[2] += 0.0 + (hrs[1] + 0.0) ? t_up_meas[1] += 3600.0*(hrs[1] + 0.0) : t_up_meas[1] += 0.0 + (t_up_meas[2] + 0.0) > 3600.0 ? t_up_meas[2] = 3600.0 : t_up_meas[2] += 0.0 } if (t_up_cmd_arr[i] ~ /min/) { split(t_up_cmd_arr[i], mins) - t_up_meas[1] += (60.0*(mins[1] + 0.0)) - (t_up_meas[2] > 60.0) ? t_up_meas[2] = 60.0 : t_up_meas[2] += 0.0 + (mins[1] + 0.0) ? t_up_meas[1] += 60.0*(mins[1] + 0.0) : t_up_meas[1] += 0.0 + (t_up_meas[2] + 0.0) > 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) + (sec[1] + 0.0) ? t_up_meas[1] += sec[1] : t_up_meas[1] += 0.0 + (t_up_meas[2] + 0.0) > 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) - (t_up_meas[2] > 3600.0) ? t_up_meas[2] = 3600.0 : t_up_meas[2] += 0.0 + (t_up_meas[2] + 0.0) > 3600.0 ? t_up_meas[2] = 3600.0 : t_up_meas[2] += 0.0 t_up_meas[1] += 60.0*(hrs_min[2] + 0.0) - (t_up_meas[2] > 60.0) ? t_up_meas[2] = 60.0 : t_up_meas[2] += 0.0 + (t_up_meas[2] + 0.0) > 60.0 ? t_up_meas[2] = 60.0 : t_up_meas[2] += 0.0 } } + if (uname ~ /FreeBSD/ || uname ~ /Linux/) { + split(ck_proc_uptime(uname), t_pu_meas) + t_pu_meas[2] = unc_g(t_pu_meas[1]) + split(merge_meas(t_up_meas[1], t_up_meas[2], t_pu_meas[1], t_pu_meas[2]), t_up_meas) + } + return sigfig(t_up_meas[1], t_up_meas[2]) } +function ck_proc_uptime(unm) { + + proc_file = "" + if (unm ~ /FreeBSD/) { + proc_file = "/compat/linux/proc/uptime" + } + if (unm ~ /Linux/) { + proc_file = "/proc/uptime" + } + + getline proc_uptime < proc_file + close(proc_file) + + return proc_uptime + +} + + BEGIN { OFMT="%f" pi = 4.0*atan2(1.0, 1.0) c0 = 299792458 # m/sec + "uname" | getline uname + close("uname") + #print("_systime_", systime()) #print("_boottime_", ck_boottime()) - print( ck_cptime() ) + #print( uname, ck_cptime() ) + + + ## check systime, check uptime, check systime again + t_meas[1] = ck_time(uname) + split(ck_uptime(uname), t_up_meas) + t_meas[2] = ck_time(uname) + + ## convert to [val, unc] vector + t_meas[2] -= t_meas[1] + t_meas[1] += 0.5*t_meas[2] + if ( t_meas[2] == 0.0 ) { + t_meas[2] = unc_g(t_meas[1]) + } + t_meas_str = sigfig(t_meas[1], t_meas[2]) + + ## estimate dt + #dt[1] = t_meas[1] - t_prev[1] + #dt[2] = t_meas[2] + t_prev[2] + print( t_meas_str, ck_cptime() ) } diff --git a/ckcptime.sh b/ckcptime.sh index 697854b..466af59 100644 --- a/ckcptime.sh +++ b/ckcptime.sh @@ -3,18 +3,28 @@ # estimate sytem boot time # [debug] enable execution tracing -#set -x +# set -x set -e # raw input data #date +%s #sysctl kern.cp_time | awk -F= '{print($0)}' -#printf "sec\n" | column -t -for N in $(seq 0 15) ; do - #printf "${N} ${t0_est}\n" | column -t - awk -f ckcptime.awk - sleep $( awk 'BEGIN {print( rand()^2.0 + 1.0 )}' ) +t_prev='0' +t_curr=$( date +%s ) + +for N in $( seq 0 90 ) ; do + while [ $t_prev -eq $t_curr ] ; do + # sleep $( awk 'BEGIN {print(rand()^2.0 + rand()^2.0)}' ) + # sleep 0.707107 + sleep 1.41421 + t_curr=$( date +%s ) + done + if [ $t_prev -ne $t_curr ] ; then + awk -f ckcptime.awk + t_prev=$t_curr + fi + done # [debug] disable execution tracing @@ -75,6 +75,7 @@ function ck_boottime(unm) { gsub(":", " ", t0_k_arr[4]) t0_k = sprintf("%04d %02d %02d %s", t0_k_arr[5], t0_k_arr[2], t0_k_arr[3], t0_k_arr[4]) t0_k = mktime(t0_k) + delete t0_k_arr } if (unm ~/FreeBSD/ || unm ~/Darwin/) { @@ -87,6 +88,18 @@ function ck_boottime(unm) { sub("^.*= ", "", t0_k_arr[n]) } t0_k = t0_k_arr[1] "." t0_k_arr[2] + delete t0_k_arr + } + + if (unm ~/Linux/) { + while( getline proc_stat < "/proc/stat" > 0 ) { + if (proc_stat ~ "btime") { + split(proc_stat, t0_k_arr) + t0_k = t0_k_arr[2] + delete t0_k_arr + } + } + close("/proc/stat") } else { @@ -3,7 +3,7 @@ # estimate sytem boot time # [debug] enable execution tracing -#set -x +# set -x set -e # raw input data @@ -20,13 +20,11 @@ if [ -f /tmp/t0_est.log ] ; then { } fi printf "n t_est t_unc t_up_est t_up_unc t0_est t0_unc\n" | column -t -for N in $(seq 0 1440) ; do +for N in $( seq 0 1440 ) ; do printf "${N} ${t0_est}\n" | column -t 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)%30.0 )}' ) done |
