服务器保活脚本/状态监控脚本,自动占用CPU内存/获取状态上报
适用于debian/ubuntu
功能:
自动占用CPU和内存(不会爆机)
自动ping测试
自动上报日志(流量消耗太少,达不到保活要求)
脚本会自动下载所需要的软件包
其中几个参数需要设置
用来测试ping的地址列表,一个txt文件,文件内每行一个网址
URL_LIST_URL="https://地址/urls.txt"
状态上报URL,POST方式上传一个JSON,不需要上报就随便填个地址即可
UPLOAD_URL="https://地址/Upload"
运行持续时间,默认120小时
MAX_RUNTIME=$((120 * 3600))
将整段脚本保存为一个.sh文件后上传到服务器,授予执行权限后执行一次即可.
最终生成的服务名称为: server-stability-test
文件在/etc/systemd/system/server-stability-text.service
#!/bin/bash
# 安装必要软件
apt-get update && apt-get install -y stress curl jq sysstat
# 启动sar监控
systemctl enable --now sysstat
# 写入测试脚本
cat << 'EOF' > /usr/local/bin/server_stability_test.sh
#!/bin/bash
UPLOAD_URL="https://上报地址/UploadResult"
URL_LIST_URL="https://地址/urls.txt"
MAX_RUNTIME=$((120 * 3600)) # 120小时
TMP_URL_FILE="/tmp/server_test_urls.txt"
LOG_FILE="/var/log/server_stability_test.log"
START_TIME=$(date +%s)
TOTAL_MEM=$(free -m | awk '/Mem:/ {print $2}')
SAFE_TOTAL=$((TOTAL_MEM * 8 / 10))
CPU_CORES=$(nproc)
[ "$CPU_CORES" -gt 32 ] && CPU_CORES=32
[ "$CPU_CORES" -lt 1 ] && CPU_CORES=1
SERVER_NAME="{{HostName}}"
START_DATE="{{StartDate}}"
SERVER_IP=$(curl -s ifconfig.me)
function update_url_list() {
curl -s "$URL_LIST_URL" -o "$TMP_URL_FILE"
}
function get_network_usage() {
NET_IF=$(ip route get 8.8.8.8 | awk '{print $5; exit}')
RX=$(awk -v iface="$NET_IF" '$1 ~ iface":" {gsub(/:/,"",$1); print $2}' /proc/net/dev)
TX=$(awk -v iface="$NET_IF" '$1 ~ iface":" {gsub(/:/,"",$1); print $10}' /proc/net/dev)
RX_MB=$((RX / 1024 / 1024))
TX_MB=$((TX / 1024 / 1024))
echo "$RX_MB $TX_MB"
}
function get_cpu_usage() {
top -bn2 | grep "Cpu(s)" | tail -n1 | awk '{print 100 - $8}' | awk '{printf "%.1f", $1}'
}
function check_js_files() {
local url="$1"
js_files=$(curl -s "$url" | grep -oP '(?<=<script src=")[^"]+' | grep -E '\.js$')
if [ -n "$js_files" ]; then
return 0 # JS files found
else
return 1 # No JS files found
fi
}
function upload_results() {
local log_content="$1"
curl -X POST "$UPLOAD_URL" \
-H "Content-Type: application/json" \
-d '{"serverName": "'"$SERVER_NAME"'", "startDate":"'"$START_DATE"'", "serverAddress": "'"$SERVER_IP"'", "logContent": "'"$log_content"'"}' \
-s
}
echo "[$(date)] 测试脚本启动" >> "$LOG_FILE"
update_url_list
ROUND=1
while true; do
CURRENT_TIME=$(date +%s)
RUNTIME=$((CURRENT_TIME - START_TIME))
if [ "$RUNTIME" -ge "$MAX_RUNTIME" ]; then
echo "[$(date)] 已运行240小时,退出。" >> "$LOG_FILE"
break
fi
MIN_CPU_WORKERS=$((CPU_CORES * 3 / 10))
MAX_CPU_WORKERS=$((CPU_CORES * 7 / 10))
[ "$MIN_CPU_WORKERS" -lt 1 ] && MIN_CPU_WORKERS=1
[ "$MAX_CPU_WORKERS" -lt "$MIN_CPU_WORKERS" ] && MAX_CPU_WORKERS=$MIN_CPU_WORKERS
RANGE=$((MAX_CPU_WORKERS - MIN_CPU_WORKERS + 1))
CPU_WORKERS=$((RANDOM % RANGE + MIN_CPU_WORKERS))
MIN_MEM=$((SAFE_TOTAL * 4 / 10))
MAX_MEM=$((SAFE_TOTAL * 8 / 10))
MEM_RANGE=$((MAX_MEM - MIN_MEM + 1))
MEM_MB=$((RANDOM % MEM_RANGE + MIN_MEM))
stress --cpu "$CPU_WORKERS" --vm 1 --vm-bytes "${MEM_MB}M" --timeout 20s &
if [ -s "$TMP_URL_FILE" ]; then
mapfile -t URL_ARRAY < "$TMP_URL_FILE"
else
URL_ARRAY=("https://www.google.com")
fi
TOTAL_URLS=0
SUCCESS_COUNT=0
JS_SUCCESS_COUNT=0
for url in "${URL_ARRAY[@]}"; do
if curl -Is --max-time 5 "$url" | grep -q "200"; then
SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
if check_js_files "$url"; then
JS_SUCCESS_COUNT=$((JS_SUCCESS_COUNT + 1))
fi
fi
TOTAL_URLS=$((TOTAL_URLS + 1))
done
URL_RATE=$((SUCCESS_COUNT * 100 / TOTAL_URLS))
JS_RATE=$((JS_SUCCESS_COUNT * 100 / TOTAL_URLS))
MEM_USAGE_PERCENT=$(( MEM_MB * 100 / TOTAL_MEM ))
read RX_MB TX_MB <<< $(get_network_usage)
CPU_USAGE_PERCENT=$(get_cpu_usage)
LOG_CONTENT="Round $ROUND | CPU Threads: ${CPU_WORKERS} | CPU使用率: ${CPU_USAGE_PERCENT}% | MEM: ${MEM_MB}MB (${MEM_USAGE_PERCENT}%) | URLS: ${SUCCESS_COUNT}/${TOTAL_URLS} (${URL_RATE}%) | JS: ${JS_SUCCESS_COUNT}/${TOTAL_URLS} (${JS_RATE}%) | RX: ${RX_MB}MB TX: ${TX_MB}MB"
echo "[$(date)] $LOG_CONTENT" >> "$LOG_FILE"
upload_results "$LOG_CONTENT"
ROUND=$((ROUND + 1))
sleep 10
done
EOF
chmod +x /usr/local/bin/server_stability_test.sh
# 创建systemd服务
cat << 'EOF' > /etc/systemd/system/server-stability-test.service
[Unit]
Description=Server Stability Test Script
After=network.target
[Service]
ExecStart=/usr/local/bin/server_stability_test.sh
Restart=always
RestartSec=5
StandardOutput=append:/var/log/server_stability_test.log
StandardError=append:/var/log/server_stability_test.log
MemoryMax=75%
[Install]
WantedBy=multi-user.target
EOF
# 启动服务
systemctl daemon-reload
systemctl enable server-stability-test.service
systemctl start server-stability-test.service
