服务器保活脚本/状态监控脚本,自动占用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