Create cpu

This commit is contained in:
2025-10-31 21:45:40 +08:00
committed by GitHub
parent fef7402b51
commit 56fd71eb6c

283
cpu Normal file
View File

@@ -0,0 +1,283 @@
#!/bin/bash
# 一键式系统压力测试脚本
# 文件名: auto_stress.sh
# 用法: sudo ./auto_stress.sh {install|start|stop|uninstall|status}
SCRIPT_NAME="system_stress"
SERVICE_FILE="/etc/systemd/system/${SCRIPT_NAME}.service"
SCRIPT_FILE="/usr/local/bin/${SCRIPT_NAME}.sh"
PID_FILE="/var/run/${SCRIPT_NAME}.pid"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
print_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
check_root() {
if [[ $EUID -ne 0 ]]; then
print_error "此脚本需要root权限请使用 sudo 运行"
exit 1
fi
}
create_stress_script() {
cat > "$SCRIPT_FILE" << 'EOF'
#!/bin/bash
# 系统压力测试脚本
STRESS_PID_FILE="/var/run/system_stress.pid"
LOG_FILE="/var/log/system_stress.log"
log_message() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
}
start_stress() {
log_message "启动系统压力测试"
# 清理可能的残留进程
pkill -f "dd if=/dev/zero" 2>/dev/null
rm -f /dev/shm/stress_mem.* 2>/dev/null
# 获取CPU核心数
CPU_CORES=$(nproc)
MEMORY_AVAILABLE=$(free -g | awk '/Mem:/ {print int($2*0.95)}')
log_message "系统信息: CPU核心=$CPU_CORES, 目标内存=${MEMORY_AVAILABLE}G"
# 启动CPU压力进程
CPU_PIDS=()
for i in $(seq 1 $((CPU_CORES * 2))); do
(
while true; do
count=0
while [ $count -lt 100000 ]; do
count=$((count + 1))
done
done
) &
CPU_PIDS+=($!)
done
# 启动内存压力进程
(
MEM_BLOCKS=()
BLOCK_SIZE=100M
TARGET_BLOCKS=$((MEMORY_AVAILABLE * 10))
for i in $(seq 1 $TARGET_BLOCKS); do
if [ $(free -m | awk '/Mem:/ {print $4}') -lt 100 ]; then
break
fi
dd if=/dev/zero of=/dev/shm/stress_mem_$$_$i bs=$BLOCK_SIZE count=1 2>/dev/null &
MEM_BLOCKS+=($!)
sleep 0.1
done
wait
) &
MEM_PID=$!
# 保存所有PID
{
for pid in "${CPU_PIDS[@]}"; do
echo $pid
done
echo $MEM_PID
} > "$STRESS_PID_FILE"
log_message "压力测试启动完成 - CPU进程: ${#CPU_PIDS[@]}, 内存PID: $MEM_PID"
echo "压力测试已启动 - 查看状态: systemctl status system_stress"
}
stop_stress() {
log_message "停止系统压力测试"
if [[ -f "$STRESS_PID_FILE" ]]; then
while read pid; do
kill -9 "$pid" 2>/dev/null
done < "$STRESS_PID_FILE"
rm -f "$STRESS_PID_FILE"
fi
# 清理残留进程和文件
pkill -f "dd if=/dev/zero" 2>/dev/null
pkill -f "while true; do" 2>/dev/null
rm -f /dev/shm/stress_mem.* 2>/dev/null
log_message "压力测试已停止"
echo "压力测试已停止"
}
case "$1" in
start)
start_stress
;;
stop)
stop_stress
;;
*)
echo "用法: $0 {start|stop}"
exit 1
;;
esac
EOF
chmod +x "$SCRIPT_FILE"
}
create_service_file() {
cat > "$SERVICE_FILE" << EOF
[Unit]
Description=System Stress Test Service
After=network.target
Wants=network.target
[Service]
Type=forking
ExecStart=$SCRIPT_FILE start
ExecStop=$SCRIPT_FILE stop
RemainAfterExit=yes
Restart=always
User=root
[Install]
WantedBy=multi-user.target
EOF
}
install_service() {
print_info "安装系统压力测试服务..."
check_root
# 创建压力测试脚本
create_stress_script
print_info "压力测试脚本已创建: $SCRIPT_FILE"
# 创建systemd服务文件
create_service_file
print_info "系统服务文件已创建: $SERVICE_FILE"
# 重新加载systemd
systemctl daemon-reload
print_info "systemd配置已重新加载"
# 启用开机自启
systemctl enable "$SCRIPT_NAME"
print_info "开机自启已启用"
# 创建日志文件
touch /var/log/system_stress.log
chmod 644 /var/log/system_stress.log
print_info "安装完成!"
echo ""
print_warning "重要警告此脚本会让系统资源达到95%使用率,请谨慎使用!"
echo ""
print_info "使用方法:"
echo " 启动压力测试: sudo systemctl start $SCRIPT_NAME"
echo " 停止压力测试: sudo systemctl stop $SCRIPT_NAME"
echo " 查看状态: sudo systemctl status $SCRIPT_NAME"
echo " 查看日志: tail -f /var/log/system_stress.log"
}
start_stress() {
check_root
print_info "启动压力测试..."
systemctl start "$SCRIPT_NAME"
systemctl status "$SCRIPT_NAME" -l
}
stop_stress() {
check_root
print_info "停止压力测试..."
systemctl stop "$SCRIPT_NAME"
print_info "压力测试已停止"
}
uninstall_service() {
check_root
print_info "卸载系统压力测试服务..."
# 停止服务
systemctl stop "$SCRIPT_NAME" 2>/dev/null
systemctl disable "$SCRIPT_NAME" 2>/dev/null
# 删除文件
rm -f "$SERVICE_FILE"
rm -f "$SCRIPT_FILE"
rm -f "$PID_FILE"
rm -f /var/log/system_stress.log
# 清理残留进程
pkill -f "dd if=/dev/zero" 2>/dev/null
pkill -f "while true; do" 2>/dev/null
rm -f /dev/shm/stress_mem.* 2>/dev/null
# 重新加载systemd
systemctl daemon-reload
print_info "卸载完成!所有相关文件已清理"
}
show_status() {
if systemctl is-active "$SCRIPT_NAME" >/dev/null 2>&1; then
print_info "压力测试服务正在运行"
systemctl status "$SCRIPT_NAME" -l
echo ""
print_info "系统资源使用情况:"
top -bn1 | head -10
else
print_info "压力测试服务未运行"
fi
}
# 主程序
case "$1" in
install)
install_service
;;
start)
start_stress
;;
stop)
stop_stress
;;
uninstall)
uninstall_service
;;
status)
show_status
;;
*)
echo "系统压力测试一键管理脚本"
echo ""
echo "用法: $0 {install|start|stop|uninstall|status}"
echo ""
echo "命令说明:"
echo " install - 安装并配置压力测试服务(开机自启)"
echo " start - 立即启动压力测试"
echo " stop - 立即停止压力测试"
echo " uninstall - 完全卸载压力测试服务"
echo " status - 查看服务状态和系统资源"
echo ""
print_warning "警告:此脚本会让系统资源达到高负载,可能影响系统稳定性!"
echo ""
exit 1
;;
esac