76 lines
2.5 KiB
Bash
Executable File
76 lines
2.5 KiB
Bash
Executable File
#!/bin/bash
|
||
# 浏览器 VNC 守护进程
|
||
|
||
set -euo pipefail
|
||
|
||
TARGET_URL="https://www.baidu.com"
|
||
VNC_PWD=${1:-"123456"} # VNC 密码
|
||
VNC_PORT=${2:-5900} # VNC 端口
|
||
DISPLAY_NUM=${3:-99} # 显示编号
|
||
DATA_DIR=${4:-"/tmp/chrome-profile-${DISPLAY_NUM}"} # 用户数据目录
|
||
PID_FILE="/tmp/chrome-browser-${DISPLAY_NUM}.pid" # 进程 ID 文件
|
||
LOG_FILE="/tmp/chrome-browser-${DISPLAY_NUM}.log" # 日志文件
|
||
|
||
GREEN='\033[0;32m'; RED='\033[0;31m'; NC='\033[0m'
|
||
log() { echo -e "${GREEN}[$(date '+%H:%M:%S')]${NC} $*"; }
|
||
err() { echo -e "${RED}[$(date '+%H:%M:%S')]${NC} $*" >&2; }
|
||
|
||
# 检查是否已在运行
|
||
if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
|
||
err "实例 :${DISPLAY_NUM} 已在运行中"
|
||
exit 1
|
||
fi
|
||
|
||
cleanup() {
|
||
log "正在清理实例 :${DISPLAY_NUM}..."
|
||
pkill -P $$ 2>/dev/null || true
|
||
pkill -f "Xvfb :${DISPLAY_NUM}" 2>/dev/null || true
|
||
pkill -f "x11vnc.*${DISPLAY_NUM}" 2>/dev/null || true
|
||
rm -f "$PID_FILE" 2>/dev/null || true
|
||
}
|
||
trap cleanup EXIT INT TERM
|
||
|
||
# 记录当前进程 ID
|
||
echo $$ > "$PID_FILE"
|
||
|
||
log "正在启动 Xvfb :${DISPLAY_NUM}"
|
||
Xvfb :${DISPLAY_NUM} -screen 0 1280x1024x24 -nolisten tcp &
|
||
sleep 2
|
||
export DISPLAY=:${DISPLAY_NUM}
|
||
|
||
log "正在启动 Chromium (数据目录: ${DATA_DIR})"
|
||
mkdir -p "$DATA_DIR"
|
||
|
||
# 查找 Chromium 可执行文件
|
||
CHROME_BIN=$(ls $HOME/.cache/ms-playwright/chromium-*/chrome-linux/chrome 2>/dev/null | head -1)
|
||
if [ -z "$CHROME_BIN" ]; then
|
||
CHROME_BIN=$(which chromium-browser 2>/dev/null || which google-chrome-stable 2>/dev/null || true)
|
||
fi
|
||
[ -z "$CHROME_BIN" ] && { err "未找到 Chromium"; exit 1; }
|
||
|
||
# 启动 Chromium(非 headless 模式,可见界面)
|
||
"$CHROME_BIN" \
|
||
--no-sandbox \
|
||
--disable-gpu \
|
||
--disable-dev-shm-usage \
|
||
--user-data-dir="${DATA_DIR}" \
|
||
--window-size=1280,1024 \
|
||
"${TARGET_URL}" &
|
||
|
||
CHROME_PID=$!
|
||
|
||
log "正在启动 x11vnc,端口: ${VNC_PORT}..."
|
||
x11vnc -display :${DISPLAY_NUM} -forever -shared -passwd ${VNC_PWD} -rfbport ${VNC_PORT} -bg &
|
||
|
||
# 获取服务器公网 IP
|
||
PUBLIC_HOST=$(curl -sf ifconfig.me 2>/dev/null || hostname -I | awk '{print $1}')
|
||
log "=========================================="
|
||
log "✅ 浏览器已启动 (仅 VNC,无 CDP)"
|
||
log "🖥️ VNC 地址: ${PUBLIC_HOST}:${VNC_PORT}"
|
||
log "🔑 VNC 密码: ${VNC_PWD}"
|
||
log "📁 数据目录: ${DATA_DIR}"
|
||
log "🛑 停止命令: ./browser-vnc.sh stop ${DISPLAY_NUM}"
|
||
log "=========================================="
|
||
|
||
# 等待 Chromium 进程结束
|
||
wait $CHROME_PID 2>/dev/null || true |