-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathupdate_strm.sh
More file actions
180 lines (152 loc) · 5.59 KB
/
Copy pathupdate_strm.sh
File metadata and controls
180 lines (152 loc) · 5.59 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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#!/bin/bash
# ================= 配置区 =================
STRM_FILE="strm.txt"
ZIP_FILE="strm.zip"
LOCAL_ZIP="local_strm_list.zip"
SIGN="?sign=SIGN_STR"
SLEEP_TIME=21600 # 6小时
PID_FILE="/tmp/strm_updater.pid"
# ==========================================
# --- 核心函数:清理并退出 ---
cleanup() {
echo -e "\n[!] 收到中断信号,正在深度清理子进程..."
# 获取当前脚本的进程组 ID (PGID) 并杀掉整个组
# 这样可以确保 Python 爬虫、unzip、git 等子进程无一漏网
# 使用 -$$ 表示当前进程组
trap - SIGINT SIGTERM # 清除 trap 防止死循环
rm -f "$PID_FILE"
kill -9 -$$ 2>/dev/null
}
# 注册信号捕捉
trap cleanup SIGINT SIGTERM
upload_github()
{
# --- 配置区 ---
TOKEN="$(cat /git_token)"
USER="zengge99"
REPO="aixiaoya"
FILE="$1" # 想要上传的文件名
BRANCH="main" # 目标分支
TARGET_PATH="$2" # 上传到 GitHub 后的文件名
# 1. 获取远程文件的 SHA(如果文件不存在,SHA 变量将为空)
SHA=$(curl -s -H "Authorization: token $TOKEN" \
"https://api.github.com/repos/$USER/$REPO/contents/$TARGET_PATH?ref=$BRANCH" \
| grep '"sha":' | cut -d '"' -f 4)
if [ $? -ne 0 ]; then
return 1;
fi
if [ -n "$SHA" ]; then
SHA_JSON="\"sha\": \"$SHA\","
else
SHA_JSON=""
fi
# 2. 将本地文件转为 Base64
if [[ "$OSTYPE" == "darwin"* ]]; then
BASE64_CONTENT=$(base64 -i "$FILE")
else
BASE64_CONTENT=$(base64 -w 0 "$FILE")
fi
# 3. 构造 JSON(动态插入 sha)
cat <<EOF > payload.json
{
"message": "$(date):自动上传 $FILE",
"content": "$BASE64_CONTENT",
"branch": "$BRANCH",
$SHA_JSON
"committer": { "name": "heiheigui", "email": "heiheigui@example.com" }
}
EOF
# 4. 发送 PUT 请求
curl -sS -X PUT \
-H "Authorization: token $TOKEN" \
-H "Content-Type: application/json" \
-d @payload.json \
"https://api.github.com/repos/$USER/$REPO/contents/$TARGET_PATH" >/dev/null
ret="$?"
rm payload.json
if [ "$ret" == 0 ]; then
echo -e "\n上传 $FILE 到github成功。"
return 0
else
echo -e "\n上传 $FILE 到github失败。"
return 1
fi
}
# 1. 杀掉旧的实例 (包括它们的子进程)
echo "正在检查旧进程..."
if [ -f "$PID_FILE" ]; then
OLD_PID=$(cat "$PID_FILE")
# 获取旧进程的进程组 ID 并杀掉全组
OLD_PGID=$(ps -o pgid= -p "$OLD_PID" 2>/dev/null | tr -d ' ')
if [ -n "$OLD_PGID" ]; then
echo "发现旧进程组 ($OLD_PGID),正在深度清理..."
kill -9 -"$OLD_PGID" 2>/dev/null
fi
rm -f "$PID_FILE"
fi
# 记录当前进程 PID
echo $$ > "$PID_FILE"
echo "[+] 当前进程 PID ($$) 已记录"
# 2. 检查依赖工具
for cmd in python3 unzip zip git; do
if ! command -v $cmd &> /dev/null; then
echo "错误: 未找到命令 $cmd,请先安装。"
exit 1
fi
done
# 3. 主循环
while true; do
echo "-------------------------------------------"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始更新任务..."
git restore . >/dev/null 2>&1
git pull >/dev/null 2>&1
rm -f "$STRM_FILE" >/dev/null 2>&1
# 运行 Python 爬虫 (后台运行并等待,方便捕捉中断)
python3 "$(dirname "$0")/strm_crawler.py" &
PYTHON_PID=$!
wait $PYTHON_PID
# 检查 python 退出状态
if [ $? -eq 0 ]; then
# 处理本地 ZIP 文件
if [ -f "$LOCAL_ZIP" ]; then
echo "[INFO] 正在处理本地 ZIP 数据..."
# 1. 提取本地 ZIP 内容到临时文件
unzip -p "$LOCAL_ZIP" > .tmp_local_content
# 2. 过滤:保留那些“不在 STRM_FILE 中”的行
# -F: 固定字符串, -v: 反向匹配, -x: 整行匹配, -f: 从文件读取匹配模板
grep -aFvxf "$STRM_FILE" .tmp_local_content > .tmp_filtered_content || true
# 3. 比较行数,判断是否有重复项被删除
# 因为local_strm_list.zip可能是全量文件生成的,需要把爬虫服务器上有的删除
ORIG_COUNT=$(wc -l < .tmp_local_content)
NEW_COUNT=$(wc -l < .tmp_filtered_content)
if [ "$NEW_COUNT" -lt "$ORIG_COUNT" ]; then
echo "[UPDATE] LOCAL_ZIP 中发现 $((ORIG_COUNT - NEW_COUNT)) 条重复项,正在清理..."
# 重新打包 LOCAL_ZIP (内部文件名固定为 local_strm_list.txt)
mv .tmp_filtered_content local_strm_list.txt
zip -qj "$LOCAL_ZIP" local_strm_list.txt
rm local_strm_list.txt
LOCAL_CHANGED=true
else
rm .tmp_filtered_content
fi
# 4. 将本地内容(去重前或去重后均可,因为后面有 sort -u)合并到主文件
cat .tmp_local_content >> "$STRM_FILE"
rm .tmp_local_content
echo "[OK] 已合并本地数据。"
fi
# 处理签名和去重
if [ -f "$STRM_FILE" ]; then
sed -i "/?sign=/! s|$|$SIGN|" "$STRM_FILE"
sort -u "$STRM_FILE" -o "$STRM_FILE"
echo "[INFO] 当前总行数: $(wc -l < "$STRM_FILE")"
zip -qj "$ZIP_FILE" "$STRM_FILE"
upload_github "$LOCAL_ZIP" "index/$LOCAL_ZIP"
upload_github "$ZIP_FILE" "index/$ZIP_FILE"
fi
else
# 如果 python 是被 kill 掉的,$? 通常不为 0
echo "[INFO] 爬虫进程已结束或被中断。"
fi
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 进入休眠..."
sleep "$SLEEP_TIME" & wait $!
done