| #!/usr/bin/env bash |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| set -euo pipefail |
|
|
| LOG=/tmp/reachy-daemon.log |
| VENV="${VENV:-$HOME/.virtualenvs/mini}" |
| START_TIMEOUT=60 |
| STOP_TIMEOUT=30 |
|
|
| cmd="${1:-}" |
|
|
| start() { |
| if pgrep -f reachy-mini-daemon >/dev/null; then |
| echo "daemon already running (PID $(pgrep -f reachy-mini-daemon | head -1))" |
| return 0 |
| fi |
| |
| |
| { |
| echo "" |
| echo "=== daemon start at $(date -u +%Y-%m-%dT%H:%M:%SZ) ===" |
| } >> "$LOG" |
| |
| source "$VENV/bin/activate" |
| nohup reachy-mini-daemon >> "$LOG" 2>&1 & |
| disown |
| local pid=$! |
| echo "daemon starting (PID $pid)" |
| local deadline=$(( $(date +%s) + START_TIMEOUT )) |
| |
| |
| |
| until awk '/=== daemon start at /{found=1; matched=0} found && /Daemon started successfully/{matched=1} END{exit !matched}' "$LOG" 2>/dev/null; do |
| if ! kill -0 "$pid" 2>/dev/null; then |
| echo "daemon died during startup; tail of log:" >&2 |
| tail -20 "$LOG" >&2 |
| return 1 |
| fi |
| if [ "$(date +%s)" -gt "$deadline" ]; then |
| echo "daemon failed to come up in ${START_TIMEOUT}s" >&2 |
| tail -20 "$LOG" >&2 |
| return 1 |
| fi |
| sleep 1 |
| done |
| echo "daemon ready" |
| } |
|
|
| stop() { |
| local pid |
| pid=$(pgrep -f reachy-mini-daemon | head -1 || true) |
| if [ -z "$pid" ]; then |
| echo "no daemon to stop" |
| return 0 |
| fi |
| |
| |
| |
| |
| |
| |
| echo "sending SIGINT to $pid" |
| kill -INT "$pid" |
| local deadline=$(( $(date +%s) + STOP_TIMEOUT )) |
| while kill -0 "$pid" 2>/dev/null; do |
| if [ "$(date +%s)" -gt "$deadline" ]; then |
| |
| |
| |
| echo "daemon did not exit in ${STOP_TIMEOUT}s after SIGINT; sending SIGKILL (will leak GST resources)" >&2 |
| kill -KILL "$pid" |
| return 1 |
| fi |
| sleep 1 |
| done |
| |
| |
| |
| |
| |
| |
| local sleep_line=0 stopped_line=0 |
| if awk '/=== daemon start at /{f=1; sleep_seen=0; stopped_seen=0} f && /Putting Reachy Mini to sleep/{sleep_seen=1} f && /Daemon stopped successfully/{stopped_seen=1} END{exit !(sleep_seen && stopped_seen)}' "$LOG" 2>/dev/null; then |
| echo "daemon stopped cleanly (sleep pose + full teardown ran)" |
| elif awk '/=== daemon start at /{f=1; m=0} f && /Daemon stopped successfully/{m=1} END{exit !m}' "$LOG" 2>/dev/null; then |
| echo "WARN: daemon exited but did NOT run sleep pose; next session may be unhealthy" >&2 |
| tail -15 "$LOG" >&2 |
| else |
| echo "WARN: daemon exited without clean-shutdown markers in log; tail:" >&2 |
| tail -15 "$LOG" >&2 |
| fi |
| } |
|
|
| case "$cmd" in |
| start) start ;; |
| stop) stop ;; |
| restart) stop && start ;; |
| *) echo "usage: $0 {start|stop|restart}" >&2; exit 2 ;; |
| esac |
|
|