91 lines
2.5 KiB
Bash
91 lines
2.5 KiB
Bash
#!/bin/bash
|
||
# 啟動字典 server(背景常駐,區網可用)
|
||
|
||
PORT=8765
|
||
SERVE_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
LOG_FILE="/tmp/dict-server-${PORT}.log"
|
||
PID_FILE="/tmp/dict-server-${PORT}.pid"
|
||
|
||
# 顏色
|
||
BOLD='\033[1m'
|
||
DIM='\033[2m'
|
||
GREEN='\033[32m'
|
||
YELLOW='\033[33m'
|
||
CYAN='\033[36m'
|
||
RESET='\033[0m'
|
||
|
||
# 取得區網 IP(過濾掉 127.x、docker、virbr 等虛擬介面)
|
||
get_lan_ip() {
|
||
ip -4 addr show scope global 2>/dev/null \
|
||
| grep -oP '(?<=inet\s)\d+(\.\d+){3}' \
|
||
| grep -v '^127\.' \
|
||
| grep -v '^172\.1[7-9]\.' \
|
||
| grep -v '^172\.2[0-9]\.' \
|
||
| grep -v '^172\.3[0-1]\.' \
|
||
| head -n1
|
||
}
|
||
|
||
# 印出可點連結(OSC 8)
|
||
print_link() {
|
||
local url="$1"
|
||
local label="${2:-$url}"
|
||
printf '\033]8;;%s\033\\%s\033]8;;\033\\' "$url" "$label"
|
||
}
|
||
|
||
# 檢查是否已經在跑
|
||
if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
|
||
OLD_PID=$(cat "$PID_FILE")
|
||
echo -e "${YELLOW}⚠ server 已經在跑了${RESET}(PID: $OLD_PID)"
|
||
echo
|
||
else
|
||
# 檢查 port 有沒有被別人佔用
|
||
if ss -tln 2>/dev/null | grep -q ":${PORT} " || \
|
||
netstat -tln 2>/dev/null | grep -q ":${PORT} "; then
|
||
echo -e "${YELLOW}⚠ port ${PORT} 已被佔用,但不是這個 script 啟動的${RESET}"
|
||
echo " 先處理掉再執行,例如:"
|
||
echo " ${DIM}lsof -i :${PORT}${RESET}"
|
||
exit 1
|
||
fi
|
||
|
||
# 啟動
|
||
cd "$SERVE_DIR" || exit 1
|
||
nohup python3 -m http.server "$PORT" --bind 0.0.0.0 \
|
||
> "$LOG_FILE" 2>&1 &
|
||
echo $! > "$PID_FILE"
|
||
|
||
# 等一下確認真的起來了
|
||
sleep 0.3
|
||
if ! kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then
|
||
echo -e "${YELLOW}✗ 啟動失敗,看 log:${RESET} $LOG_FILE"
|
||
rm -f "$PID_FILE"
|
||
exit 1
|
||
fi
|
||
|
||
echo -e "${GREEN}✓ server 已啟動${RESET}(PID: $(cat "$PID_FILE"))"
|
||
echo
|
||
fi
|
||
|
||
# 顯示資訊
|
||
LAN_IP=$(get_lan_ip)
|
||
LOCAL_URL="http://localhost:${PORT}/"
|
||
|
||
echo -e "${BOLD}服務目錄${RESET} ${DIM}${SERVE_DIR}${RESET}"
|
||
echo -e "${BOLD}log${RESET} ${DIM}${LOG_FILE}${RESET}"
|
||
echo
|
||
echo -e "${BOLD}網址${RESET}"
|
||
printf ' 本機 '
|
||
print_link "$LOCAL_URL"
|
||
printf '\n'
|
||
|
||
if [ -n "$LAN_IP" ]; then
|
||
LAN_URL="http://${LAN_IP}:${PORT}/"
|
||
printf ' 區網 '
|
||
print_link "$LAN_URL"
|
||
printf '\n'
|
||
else
|
||
echo -e " ${DIM}(找不到區網 IP)${RESET}"
|
||
fi
|
||
|
||
echo
|
||
echo -e "${DIM}停止:${RESET} kill \$(cat $PID_FILE) ${DIM}或${RESET} pkill -f \"http.server ${PORT}\""
|