当前位置:首页 > 编程 > 其它语言 > 正文内容

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


分享给朋友:
返回列表

没有更早的文章了...

没有最新的文章了...

“服务器保活脚本/状态监控脚本,自动占用CPU内存/获取状态上报” 的相关文章

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。