summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwukong <wukong@longaeva>2026-06-09 10:47:09 -0700
committerwukong <wukong@longaeva>2026-06-09 10:47:09 -0700
commit7fb50be1944f3a76a285ac04423ae233728b5bf7 (patch)
tree957548d230a9ab48eb80dac4d8ee5e493cbaea6d
parent40548183b45666afc50373b0ee172465660fc479 (diff)
merge code between ckcptime and ckt0 scripts;
added btime check from /proc/stat in ckt0.awk;
-rw-r--r--ckcptime.awk135
-rw-r--r--ckcptime.sh22
-rw-r--r--ckt0.awk13
-rw-r--r--ckt0.sh6
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
diff --git a/ckt0.awk b/ckt0.awk
index 720be64..1155061 100644
--- a/ckt0.awk
+++ b/ckt0.awk
@@ -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 {
diff --git a/ckt0.sh b/ckt0.sh
index 76a9c09..3b62d92 100644
--- a/ckt0.sh
+++ b/ckt0.sh
@@ -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