Skip to content

Commit ccd7a58

Browse files
committed
multi judgers
1 parent 8532a24 commit ccd7a58

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
uoj_data/
33
.php-cs-fixer.cache
44
.config.local.php
5-
*.pcap
5+
*.pcap
6+
confs/

spawn_judgers.sh

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
# === 可配置 ===
5+
IMAGE="uoj-judger:local"
6+
NETWORK="uoj-net"
7+
UOJ_HOST_NAME="uoj" # 与 UOJ 主容器在同一网络下的容器名;用名字避免写死 IP
8+
MYSQL_CONT="uoj-db" # MySQL 容器名
9+
MYSQL_DB="app_uoj233"
10+
MYSQL_USER="root"
11+
MYSQL_PASS="root"
12+
JUDGER_PASS_DEFAULT="changeme" # 如果不想每台都不同,就用统一密码
13+
CPU_LIMIT="" # 例如 "--cpus=1.0"
14+
MEM_LIMIT="" # 例如 "--memory=1g"
15+
16+
# 用法: ./spawn_judgers.sh 数量 前缀(可选) 密码(可选)
17+
COUNT="${1:-3}"
18+
NAME_PREFIX="${2:-judger}"
19+
JUDGER_PASS="${3:-$JUDGER_PASS_DEFAULT}"
20+
21+
mkdir -p confs
22+
23+
# 确保网络存在
24+
docker network inspect "$NETWORK" >/dev/null 2>&1 || docker network create "$NETWORK"
25+
26+
for i in $(seq 1 "$COUNT"); do
27+
NAME="${NAME_PREFIX}${i}"
28+
CONF="confs/conf-${NAME}.json"
29+
30+
# 生成每台评测机的 conf.json
31+
cat > "$CONF" <<EOF
32+
{
33+
"uoj_host": "${UOJ_HOST_NAME}",
34+
"judger_name": "${NAME}",
35+
"judger_password": "${JUDGER_PASS}",
36+
"socket_port": 2333,
37+
"socket_password": "${JUDGER_PASS}",
38+
"use_http_judge": false
39+
}
40+
EOF
41+
42+
# 如已存在,先删容器(不删镜像)
43+
if docker ps -a --format '{{.Names}}' | grep -q "^${NAME}$"; then
44+
docker rm -f "${NAME}" >/dev/null
45+
fi
46+
47+
# 拉起容器:共享同一镜像,外挂只读 conf,限制资源(按需启用)
48+
docker run -d --name "${NAME}" \
49+
--cap-add SYS_PTRACE \
50+
--network "${NETWORK}" \
51+
-v "$(pwd)/${CONF}:/opt/uoj/judger/.conf.json:ro" \
52+
$CPU_LIMIT $MEM_LIMIT \
53+
"${IMAGE}"
54+
55+
# 取容器 IP(在自定义网络下)
56+
IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "${NAME}")
57+
58+
# 写入 MySQL(入库一次即可)
59+
docker exec -i "${MYSQL_CONT}" \
60+
mysql -u"${MYSQL_USER}" -p"${MYSQL_PASS}" "${MYSQL_DB}" \
61+
-e "INSERT INTO judger_info (judger_name, password, ip) VALUES ('${NAME}', '${JUDGER_PASS}', '${IP}')
62+
ON DUPLICATE KEY UPDATE password=VALUES(password), ip=VALUES(ip);"
63+
64+
echo "Launched ${NAME} at ${IP}"
65+
done
66+
67+
echo "Done."

0 commit comments

Comments
 (0)