#!/bin/bash #### Tested running on a 1232 SOCK="/var/run/ptp4l_media1" HOST=$(hostname) LOGFILE="ptp_media1.log" WINDOW=60 offsets=() delays=() freqs=() prev_offset="" prev_time="" while true; do now_fmt=$(date +"%b %d %T") uptime=$(awk '{print $1}' /proc/uptime) now_ns=$(date +%s%N) # --- get offset --- ts_np=$(pmc -u -s $SOCK "GET TIME_STATUS_NP") offset=$(echo "$ts_np" | awk '/master_offset/ {print $2}') # --- get delay --- cds=$(pmc -u -s $SOCK "GET CURRENT_DATA_SET") delay=$(echo "$cds" | awk '/meanPathDelay/ {print $2}') # --- compute freq (ns/sec ≈ ppb-like behaviour) --- if [[ -n "$prev_offset" ]]; then dt=$((now_ns - prev_time)) doffset=$((offset - prev_offset)) freq=$(awk -v d="$doffset" -v t="$dt" 'BEGIN {printf "%.0f", (d / t) * 1e9}') else freq=0 fi prev_offset=$offset prev_time=$now_ns # store offsets+=("$offset") delays+=("$delay") freqs+=("$freq") # trim window if [ ${#offsets[@]} -gt $WINDOW ]; then offsets=("${offsets[@]:1}") delays=("${delays[@]:1}") freqs=("${freqs[@]:1}") fi # --- stats --- rms=$(printf "%s\n" "${offsets[@]}" | awk '{s+=$1*$1} END {printf "%.0f", sqrt(s/NR)}') max=$(printf "%s\n" "${offsets[@]}" | \ awk 'BEGIN{m=0}{if($1>m)m=$1;if(-$1>m)m=-$1}END{print m}') freq_avg=$(printf "%s\n" "${freqs[@]}" | awk '{s+=$1} END {printf "%.0f", s/NR}') freq_std=$(printf "%s\n" "${freqs[@]}" | \ awk '{s+=$1; ss+=$1*$1} END {m=s/NR; printf "%.0f", sqrt(ss/NR - m*m)}') delay_avg=$(printf "%s\n" "${delays[@]}" | awk '{s+=$1} END {printf "%.0f", s/NR}') delay_std=$(printf "%s\n" "${delays[@]}" | \ awk '{s+=$1; ss+=$1*$1} END {m=s/NR; printf "%.0f", sqrt(ss/NR - m*m)}') line="$now_fmt $HOST ptp4l@media1[$$]: [$uptime] rms $rms max $max freq $freq_avg +/- $freq_std delay $delay_avg +/- $delay_std" echo "$line" | tee -a "$LOGFILE" sleep 1 done