Repository navigation
Expand file tree
/
Copy pathCoachOS.command
More file actions
executable file
·68 lines (57 loc) · 1.73 KB
/
Copy pathCoachOS.command
File metadata and controls
executable file
·68 lines (57 loc) · 1.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/bin/zsh
set -e
cd "$(dirname "$0")"
PYTHON_CMD="python3"
APP_PYTHON="$PYTHON_CMD"
DASHBOARD_PORT="8766"
IMPORT_TOOL_PORT="8765"
stop_server_on_port() {
local port="$1"
local label="$2"
local pids
pids=$(lsof -tiTCP:"$port" -sTCP:LISTEN 2>/dev/null || true)
if [ -z "$pids" ]; then
return 0
fi
echo "偵測到 $label http://127.0.0.1:$port 已經在執行,正在關閉舊伺服器..."
for pid in ${(f)pids}; do
kill "$pid" 2>/dev/null || true
done
for _ in {1..30}; do
if ! lsof -tiTCP:"$port" -sTCP:LISTEN >/dev/null 2>&1; then
echo "$label 舊伺服器已關閉。"
return 0
fi
sleep 0.2
done
echo "無法自動關閉 $label。請先關掉舊視窗,或在終端機執行:"
echo "lsof -nP -iTCP:$port -sTCP:LISTEN"
exit 1
}
if [ -x ".venv/bin/python" ]; then
APP_PYTHON=".venv/bin/python"
elif [ -d ".venv/lib/python3.14/site-packages" ]; then
export PYTHONPATH=".venv/lib/python3.14/site-packages${PYTHONPATH:+:$PYTHONPATH}"
else
"$PYTHON_CMD" -m venv .venv
APP_PYTHON=".venv/bin/python"
fi
if ! "$APP_PYTHON" - <<'PY' >/dev/null 2>&1
import garmin_fit_sdk
import openpyxl
import garminconnect
PY
then
"$PYTHON_CMD" -m venv --clear .venv
APP_PYTHON=".venv/bin/python"
"$APP_PYTHON" -m pip install -r requirements.txt
fi
stop_server_on_port "$IMPORT_TOOL_PORT" "資料匯入工具"
stop_server_on_port "$DASHBOARD_PORT" "CoachOS"
echo "啟動 CoachOS..."
echo "首頁會先打開平台;需要轉檔時,再從首頁進入 RAC。"
echo ""
echo "平台網址:http://127.0.0.1:$DASHBOARD_PORT/"
echo "按 Ctrl+C 或直接關閉視窗即可停止。"
echo ""
exec "$APP_PYTHON" analysis_platform/dashboard_app.py analysis_platform/running_analytics.sqlite --port "$DASHBOARD_PORT"