@@ -344,6 +344,11 @@ monitor_server_startup() {
344344
345345 # Poll the latest log content (no buffering issues)
346346 local logs
347+ if ! docker ps --filter " name=^${container} $" --format ' {{.ID}}' 2> /dev/null | grep -q . ; then
348+ status_msg=" Slot ${slot_number} : Container ${container} not found — waiting"
349+ sleep 1
350+ continue
351+ fi
347352 logs=$( docker logs " $container " 2>&1 )
348353
349354 # Check for firmware mismatch
@@ -389,13 +394,40 @@ monitor_server_startup() {
389394 fi
390395 fi
391396
392- # Detect heartbeat (server ZMQ/EPICS is responding)
393- if ! $heartbeat_ok && echo " $logs " | grep -q " Running. Hit cntrl-c" ; then
394- if is_rogue_server_up ${slot_number} > /dev/null 2>&1 ; then
397+ # Detect server process is running, then verify heartbeat
398+ if ! $heartbeat_ok && echo " $logs " | grep -q " Running\. Hit cntrl-c" ; then
399+ if [[ -t 1 ]]; then printf " \r\033[K" ; fi
400+ success " Slot ${slot_number} : smurf_server_s${slot_number} process started ${DIM} (${elapsed} s)${RESET} "
401+ status_msg=" Slot ${slot_number} : Verifying ZMQ heartbeat"
402+
403+ # Heartbeat retry loop — ZMQ takes a moment to bind after server starts
404+ local hb_start=$( date +%s)
405+ local hb_timeout=60
406+ local hb_ok=false
407+ while (( $(date +% s) - hb_start < hb_timeout )) ; do
408+ if [[ -t 1 ]]; then
409+ local hb_elapsed=$(( $(date +% s) - hb_start ))
410+ printf " \r\033[K ${CYAN} %s${RESET} Slot %s: Verifying heartbeat ${DIM} (%ds)${RESET} " \
411+ " ${frames[$fi]} " " $slot_number " " $hb_elapsed "
412+ fi=$(( (fi + 1 ) % ${# frames[@]} ))
413+ fi
414+ if is_rogue_server_up ${slot_number} > /dev/null 2>&1 ; then
415+ hb_ok=true
416+ break
417+ fi
418+ sleep 2
419+ done
420+
421+ if $hb_ok ; then
395422 heartbeat_ok=true
396423 if [[ -t 1 ]]; then printf " \r\033[K" ; fi
397- success " smurf_server_s${slot_number} rogue heartbeat detected ${DIM} (${elapsed} s)${RESET} "
398- status_msg=" Server running setDefaults"
424+ success " Slot ${slot_number} : Heartbeat confirmed (timestamp incrementing)"
425+ status_msg=" Slot ${slot_number} : Waiting for server init to complete"
426+ else
427+ if [[ -t 1 ]]; then printf " \r\033[K" ; fi
428+ warn " Slot ${slot_number} : Heartbeat not detected after ${hb_timeout} s — continuing anyway"
429+ heartbeat_ok=true
430+ status_msg=" Slot ${slot_number} : Waiting for server init to complete"
399431 fi
400432 fi
401433
@@ -405,9 +437,9 @@ monitor_server_startup() {
405437 local current_try=$( echo " $logs " | grep -c " ^Setting defaults from file" )
406438 local retry_cnt=$( echo " $logs " | grep -o " retryCnt = [0-9]*" | tail -1 | grep -oP ' [0-9]+' )
407439 if [[ -n " $retry_cnt " && " $retry_cnt " -gt 0 ]]; then
408- status_msg=" setDefaults try ${current_try} , AppTop.Init() retry ${retry_cnt} /7"
440+ status_msg=" Slot ${slot_number} : Server setDefaults try ${current_try} , JESD init retry ${retry_cnt} /7"
409441 else
410- status_msg=" setDefaults try ${current_try} , running AppTop.Init() "
442+ status_msg=" Slot ${slot_number} : Server setDefaults try ${current_try} "
411443 fi
412444 fi
413445
0 commit comments