主题
Linux运维简要笔记📒
1.1 Linux 终端 变成-bash-4.2$解决办法
原因:用户user的家目录下文件丢失导致,缺少下面2个文件bash_profile bashrc
1、切换到有故障的用户
su - user
2、复制/etc/skel 里面的模板到当前用户
cp /etc/skel/.bash* ~
exit重新切换即可!1.2 dockerhub 加速地址
🤣总有一个有用
bash
{
"registry-mirrors": [
"https://docker.hpcloud.cloud",
"https://docker.m.daocloud.io",
"https://docker.mybacc.com",
"https://docker.1panel.live",
"http://mirrors.ustc.edu.cn",
"https://docker.chenby.cn",
"http://mirror.azure.cn",
"https://dockerpull.org",
"https://dockerhub.icu",
"https://hub.rat.dev",
"https://proxy.1panel.live",
"https://docker.1panel.top",
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://docker.ketches.cn"
]
}1.3 MacOS下Homebrew国内镜像加速配置
bash
#查看当前使用的是哪种SHELl
echo $SHELl
#修改对应的SHELl配置文件
vim ~/.bash_profile # bash用户
vim ~/.zshrc # zsh用户(推荐)然后在文件末尾添加如下配置:
bash
# 🍺 Homebrew国内镜像加速配置
# 推荐使用USTC或清华镜像,阿里镜像git clone可能有问题
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.ustc.edu.cn/homebrew-core.git"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles"
# 🎯 最新brew API国内加速(关键配置)
export HOMEBREW_API_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles/api"
# 🤫 隐藏环境变量提示
export HOMEBREW_NO_ENV_HINTS="1"保存并退出后,使配置生效:
bash
source ~/.bash_profile
# 或者
source ~/.zshrc配置完成后,你再运行brew安装指令,将感受到飞一般的畅快体验!🎉
bash
brew install telnet1.4查看一个命名空间下所有pod 的报错日志
bash
kubectl get pod -n paas-ec | grep -v NAME | awk '{print $1}' | xargs -I {} sh -c 'printf "\e[1;7mLogs for Pod {}:\e[0m\n" && kubectl logs --tail=50 -n paas-ec {} | grep -i -C 10 error'
1.5 ubuntu22.04开启root用户登录
- 设置 root 用户的密码
bash
sudo passwd root- 配置允许 root 用户直接登录
bash
vim /etc/ssh/sshd_config
#找到相应代码行并注释
#PermitRootLogin prohibit-password
#加上
PermitRootLogin yes- 重启 ssh 服务
bash
service ssh restart1.6 linux下查看网址经过路由的命令
bash
traceroute www.163.com
traceroute 114.114.114.114centos/openeuler 系统上安装traceroute命令
bash
yum install tracerouteubuntu 系统上安装traceroute命令
bash
apt install traceroute1.7 centos7.9 软件仓库镜像加速
DANGER
CentOS 7 已于 2024 年 6 月 30 日结束维护,建议立即迁移到其他解决方案。如有需要继续使用 CentOS,请查阅 CentOS Vault 帮助。
阿里云 CentOS Vault 镜像加速
bash
cat > /etc/yum.repos.d/CentOS-Base.repo << 'EOF'
[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=https://mirror.nju.edu.cn/centos-vault/7.9.2009/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
baseurl=https://mirror.nju.edu.cn/centos-vault/7.9.2009/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
baseurl=https://mirror.nju.edu.cn/centos-vault/7.9.2009/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
baseurl=https://mirror.nju.edu.cn/centos-vault/7.9.2009/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF南大 CentOS Vault 镜像加速
bash
cat > /etc/yum.repos.d/CentOS-Base.repo << 'EOF'
[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=https://mirror.nju.edu.cn/centos-vault/7.9.2009/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
baseurl=https://mirror.nju.edu.cn/centos-vault/7.9.2009/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
baseurl=https://mirror.nju.edu.cn/centos-vault/7.9.2009/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
baseurl=https://mirror.nju.edu.cn/centos-vault/7.9.2009/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
EOF1.8 vcenter SSL证书过期时间
最简单解决步骤: 1.ssh登录vcenter server后台,用户名root,密码和控制台的administrator管理员密码相同,长期不登录可能会提示你密码过期需要更新。 2.输入shell,然后使用date -s 20241010这样的命令修改日期到证书过期前即可不需要很准确。 3.再次登录vCenter Client,现在可以登录进去了。 4.进入菜单,系统管理-证书-证书管理,可以看到右侧的ssl证书已经过期了,点击操作中的续订即可。 5.回到之前的命令行输入“service-control --restart vpxd”重启vCenter Server服务后即恢复正常。
1.9 rocky linux: 禁止使用root登录ssh,只允许指定用户登录
- 先创建指定用户,并设置密码
bash
useradd srebro
passwd srebro- 配置ssh
bash
[root@img ~]# vim /etc/ssh/sshd_config
#设置PermitRootLogin值为no
#PermitRootLogin yes
PermitRootLogin no
#新增一行: 只允许 srebro 用户登录
AllowUsers srebro- 检测配置是否正确,并重启 ssh
bash
sshd -t
systemctl restart sshd1.10 nacos 启动后报错,Caused by: java.lang.IllegalStateException: No DataSource set
- 现象: nacos 在运行好长一段时间后,突然无法启动;报错 Caused by: java.lang.IllegalStateException: No DataSource set
bash
nacos | 2025-12-04 22:44:39,153 ERROR Application run failed
nacos |
nacos | org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memoryMonitor' defined in URL [jar:file:/home/nacos/target/nacos-server.jar!/BOOT-INF/lib/nacos-config-2.2.0.jar!/com/alibaba/nacos/config/server/monitor/MemoryMonitor.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'asyncNotifyService': Unsatisfied dependency expressed through field 'dumpService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'externalDumpService': Invocation of init method failed; nested exception is ErrCode:500, ErrMsg:Nacos Server did not start because dumpservice bean construction failure :
nacos | No DataSource set
nacos | at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800)
nacos | at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229)
nacos | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372)
nacos | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222)
nacos | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
nacos | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
nacos | at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
nacos | at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
nacos | at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
nacos | at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
nacos | at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:953)
nacos | at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
nacos | at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
nacos | at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
nacos | at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:745)
nacos | at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:420)
nacos | at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
nacos | at org.springframework.boot.SpringApplication.run(SpringApplication.java:1317)
nacos | at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)
nacos | at com.alibaba.nacos.Nacos.main(Nacos.java:35)
nacos | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
nacos | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
nacos | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
nacos | at java.lang.reflect.Method.invoke(Method.java:498)
nacos | at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
nacos | at org.springframework.boot.loader.Launcher.launch(Launcher.java:108)
nacos | at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
nacos | at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:467)
nacos | Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'asyncNotifyService': Unsatisfied dependency expressed through field 'dumpService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'externalDumpService': Invocation of init method failed; nested exception is ErrCode:500, ErrMsg:Nacos Server did not start because dumpservice bean construction failure :
nacos | No DataSource set
nacos | at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)
nacos | at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639)
nacos | at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
nacos | at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
nacos | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431)
nacos | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)
nacos | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
nacos | at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
nacos | at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
nacos | at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
nacos | at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
nacos | at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
nacos | at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1389)
nacos | at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1309)
nacos | at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887)
nacos | at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
nacos | ... 27 common frames omitted
nacos | Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'externalDumpService': Invocation of init method failed; nested exception is ErrCode:500, ErrMsg:Nacos Server did not start because dumpservice bean construction failure :
nacos | No DataSource set
nacos | at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160)
nacos | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:440)
nacos | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796)
nacos | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
nacos | at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
nacos | at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
nacos | at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
nacos | at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
nacos | at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
nacos | at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
nacos | at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1389)
nacos | at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1309)
nacos | at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:656)
nacos | ... 42 common frames omitted
nacos | Caused by: com.alibaba.nacos.api.exception.NacosException: Nacos Server did not start because dumpservice bean construction failure :
nacos | No DataSource set
nacos | at com.alibaba.nacos.config.server.service.dump.DumpService.dumpOperate(DumpService.java:260)
nacos | at com.alibaba.nacos.config.server.service.dump.ExternalDumpService.init(ExternalDumpService.java:61)
nacos | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
nacos | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
nacos | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
nacos | at java.lang.reflect.Method.invoke(Method.java:498)
nacos | at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389)
nacos | at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333)
nacos | at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157)
nacos | ... 54 common frames omitted
nacos | Caused by: java.lang.IllegalStateException: No DataSource set
nacos | at org.springframework.util.Assert.state(Assert.java:76)
nacos | at org.springframework.jdbc.support.JdbcAccessor.obtainDataSource(JdbcAccessor.java:86)
nacos | at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:376)
nacos | at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:465)
nacos | at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:475)
nacos | at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:508)
nacos | at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:515)
nacos | at com.alibaba.nacos.config.server.service.repository.extrnal.ExternalConfigInfoPersistServiceImpl.findConfigMaxId(ExternalConfigInfoPersistServiceImpl.java:616)
nacos | at com.alibaba.nacos.config.server.service.dump.processor.DumpAllProcessor.process(DumpAllProcessor.java:51)
nacos | at com.alibaba.nacos.config.server.service.dump.DumpService.dumpConfigInfo(DumpService.java:317)
nacos | at com.alibaba.nacos.config.server.service.dump.DumpService.dumpOperate(DumpService.java:230)
nacos | ... 62 common frames omitted
nacos | 2025-12-04 22:44:39,157 WARN [ThreadPoolManager] Start destroying ThreadPool
nacos |- 解决方法:
看了网络上很多方案,有说在启动参数里加上 allowPublicKeyRetrieval=true , 但我测试后发现都不管用; 我最终是 把 mysql8 中的 nacos 用户,指定密码插件为mysql_native_password。
bash
## 修改用户的密码插件为mysql_native_password,并设置密码
ALTER USER 'nacos'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxxxxx';- 关于 nacos 的部署,可参考 : https://blog.srebro.cn/archives/90
1.11 nvm 报错try nvm ls-remote to browse available versions.
问题现象: 前端在使用 nvm 切换 node 版本的时候,报错:
trynvm ls-remoteto browse available versions.
大概率是https://nodejs.org/ 挂了解决方法: 配置node 其他站点的加速,比如https://npmmirror.com/mirrors/node
(macOS/Linux): 添加到你的 Shell 配置文件 (~/.zshrc 或 ~/.bashrc 或 /etc/profile)
bash
vim /etc/profile
#加速nvm
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
source /etc/profilewindows 在 nvm 的安装目录(如 C:\Users<用户名>\AppData\Roaming\nvm)下找到 settings.txt 文件,添加
bash
node_mirror: https://npmmirror.com/mirrors/node/
npm_mirror: https://npmmirror.com/mirrors/npm/1.12 cpu 压力测试脚本+工具
cpu 压力测试脚本, 使用方法: ./cpu_stress_fast.sh [持续时间(秒)] [负载强度百分比]
bash
#!/bin/bash
# CPU负载压力测试脚本 - 快速提升版
# 用法: ./cpu_stress_fast.sh [持续时间(秒)] [负载强度百分比]
# 捕获中断信号
trap 'cleanup' INT TERM EXIT
cleanup() {
echo -e "\n[中断] 清理进程..."
# 杀死所有负载进程
pkill -f "stress_cpu" 2>/dev/null
# 杀死所有无限循环进程
pids=$(jobs -p)
if [ -n "$pids" ]; then
kill -9 $pids 2>/dev/null
fi
echo "所有进程已终止"
exit 0
}
# 显示帮助
show_help() {
echo "========================================"
echo "CPU负载快速压力测试脚本"
echo "========================================"
echo "用法: $0 [持续时间(秒)] [负载强度百分比]"
echo ""
echo "示例:"
echo " $0 300 100 # 5分钟,100%负载"
echo " $0 60 80 # 1分钟,80%负载"
echo " $0 120 # 2分钟,100%负载(默认)"
echo ""
echo "特点:"
echo " - 快速达到目标负载"
echo " - 更精确的负载控制"
echo " - 实时显示CPU使用率"
echo "========================================"
exit 0
}
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
show_help
fi
# 参数设置
DURATION=${1:-120}
INTENSITY=${2:-100}
CPU_CORES=$(nproc 2>/dev/null || echo 4)
if ! [[ "$DURATION" =~ ^[0-9]+$ ]] || [ $DURATION -le 0 ]; then
echo "错误: 持续时间必须是正整数"
exit 1
fi
if ! [[ "$INTENSITY" =~ ^[0-9]+$ ]] || [ $INTENSITY -lt 1 ] || [ $INTENSITY -gt 100 ]; then
echo "错误: 负载强度必须是1-100之间的整数"
exit 1
fi
echo ""
echo "========================================"
echo "CPU负载快速压力测试"
echo "========================================"
echo "系统信息:"
echo " CPU核心数: $CPU_CORES"
echo " 当前时间: $(date '+%H:%M:%S')"
echo " 当前负载: $(uptime | awk -F'load average:' '{print $2}')"
echo ""
echo "测试参数:"
echo " 持续时间: $DURATION 秒"
echo " 目标强度: $INTENSITY%"
echo " 进程策略: 每个核心启动 2-4 个进程"
echo "========================================"
echo ""
# 计算需要启动的进程数(更激进,更快达到高负载)
if [ $INTENSITY -eq 100 ]; then
# 100%负载:每个核心启动2个进程,产生更多竞争
NUM_PROCESSES=$((CPU_CORES * 2))
echo "模式: 满负载模式 (每个核心2个竞争进程)"
else
# 非100%负载:每个核心启动4个进程,通过工作-休眠控制强度
NUM_PROCESSES=$((CPU_CORES * 4))
echo "模式: 可控负载模式 (每个核心4个进程)"
fi
echo "启动进程数: $NUM_PROCESSES"
echo "预计启动时间: 2-3秒"
echo ""
# 显示初始负载
echo "当前系统负载:"
uptime
echo ""
# 显示倒计时
echo "测试将在3秒后开始..."
for i in {3..1}; do
echo -n "$i... "
sleep 1
done
echo "启动!"
echo ""
# 获取开始时间
START_TIME=$(date +%s)
END_TIME=$((START_TIME + DURATION))
# 函数:显示实时CPU使用率(后台运行)
show_cpu_usage() {
echo "监控CPU使用率(每2秒刷新):"
echo "按 Ctrl+C 终止测试和监控"
echo ""
while true; do
local current_time=$(date +%s)
if [ $current_time -ge $END_TIME ]; then
break
fi
local remaining=$((END_TIME - current_time))
local mins=$((remaining / 60))
local secs=$((remaining % 60))
# 获取CPU使用率
local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
# 获取负载平均值
local load_avg=$(uptime | awk -F'load average:' '{print $2}' | tr -d ' ')
# 获取CPU温度(如果可用)
local temp="N/A"
if command -v sensors >/dev/null 2>&1; then
temp=$(sensors 2>/dev/null | grep -E "Core|Package" | head -1 | awk '{print $3}' | tr -d '+°C') || temp="N/A"
fi
echo -ne "时间: $(date '+%H:%M:%S') | 剩余: ${mins}:$(printf "%02d" $secs) | CPU: ${cpu_usage}% | 负载: ${load_avg} | 温度: ${temp}°C \r"
sleep 2
done
}
# 在后台启动监控
show_cpu_usage &
MONITOR_PID=$!
# 函数:快速CPU负载生成器(使用C编译的小程序)
generate_fast_load() {
local intensity=$1
local pid=$2
# 内联C代码,编译为小型可执行文件
cat > /tmp/stress_cpu_$pid.c << 'EOF'
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <sys/time.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "用法: %s <强度(0-100)> <持续时间(秒)>\n", argv[0]);
return 1;
}
int intensity = atoi(argv[1]);
int duration = atoi(argv[2]);
long work_ns, sleep_ns;
if (intensity <= 0 || intensity > 100) {
fprintf(stderr, "强度必须在1-100之间\n");
return 1;
}
// 计算工作时间和休眠时间(100毫秒周期)
work_ns = 100000000L * intensity / 100; // 100ms = 100,000,000ns
sleep_ns = 100000000L - work_ns;
struct timespec work_time, sleep_time, start_time, current_time;
clock_gettime(CLOCK_MONOTONIC, &start_time);
work_time.tv_sec = work_ns / 1000000000;
work_time.tv_nsec = work_ns % 1000000000;
sleep_time.tv_sec = sleep_ns / 1000000000;
sleep_time.tv_nsec = sleep_ns % 1000000000;
while (1) {
clock_gettime(CLOCK_MONOTONIC, ¤t_time);
if (current_time.tv_sec - start_time.tv_sec >= duration) {
break;
}
// 工作阶段
if (work_ns > 0) {
struct timespec target_time;
clock_gettime(CLOCK_MONOTONIC, &target_time);
target_time.tv_nsec += work_ns;
if (target_time.tv_nsec >= 1000000000) {
target_time.tv_sec += 1;
target_time.tv_nsec -= 1000000000;
}
// 忙等待循环
struct timespec now;
do {
clock_gettime(CLOCK_MONOTONIC, &now);
} while (now.tv_sec < target_time.tv_sec ||
(now.tv_sec == target_time.tv_sec && now.tv_nsec < target_time.tv_nsec));
}
// 休眠阶段
if (sleep_ns > 0) {
nanosleep(&sleep_time, NULL);
}
}
return 0;
}
EOF
# 编译并运行
gcc -o /tmp/stress_cpu_$pid /tmp/stress_cpu_$pid.c 2>/dev/null
if [ $? -eq 0 ]; then
/tmp/stress_cpu_$pid $intensity $DURATION >/dev/null 2>&1
rm -f /tmp/stress_cpu_$pid /tmp/stress_cpu_$pid.c
else
# 如果编译失败,使用纯bash方法(较慢)
local end_time=$(( $(date +%s) + DURATION ))
local work_ms=$((10 * intensity)) # 10ms周期中的工作时间
local sleep_ms=$((10 - work_ms / 10))
while [ $(date +%s) -lt $end_time ]; do
if [ $work_ms -gt 0 ]; then
local start_ns=$(date +%s%N)
local target_ns=$((start_ns + work_ms * 1000000))
while [ $(date +%s%N) -lt $target_ns ]; do
: # 忙等待
done
fi
if [ $sleep_ms -gt 0 ]; then
sleep 0.$(printf "%03d" $sleep_ms)
fi
done
fi
}
# 启动负载进程
echo "启动负载进程..."
PIDS=""
if [ $INTENSITY -eq 100 ]; then
# 100%负载:简单的无限循环
echo "使用无限循环模式 (100%负载)"
for i in $(seq 1 $NUM_PROCESSES); do
(
# 使用数学计算增加CPU压力
while true; do
# 增加一些计算量,让CPU更忙
for j in {1..1000}; do
result=$(echo "scale=1000; 4*a(1)" | bc -l 2>/dev/null)
done
done
) &
PIDS="$PIDS $!"
echo -n "."
done
else
# 可控负载:使用快速负载生成器
echo "使用可控负载模式 ($INTENSITY%强度)"
for i in $(seq 1 $NUM_PROCESSES); do
generate_fast_load $INTENSITY $$ &
PIDS="$PIDS $!"
echo -n "."
done
fi
echo ""
echo "已启动 $NUM_PROCESSES 个进程"
echo "负载开始提升..."
# 等待指定时间
echo ""
echo "测试进行中,请查看上方实时监控信息..."
echo "按 Ctrl+C 提前终止测试"
echo ""
sleep $DURATION
# 测试结束
echo ""
echo "========================================"
echo "测试完成!"
echo "========================================"
echo "结束时间: $(date '+%H:%M:%S')"
echo "持续时间: $DURATION 秒"
echo "最终负载: $(uptime | awk -F'load average:' '{print $2}')"
# 清理进程
cleanup
# 等待监控进程结束
wait $MONITOR_PID 2>/dev/null
echo "测试完成!系统负载将逐渐恢复正常"cpu 压力测试工具使用方法:
bash
# 安装stress-ng
sudo apt-get install stress-ng
# 快速产生高负载(使用所有CPU核心)
stress-ng --cpu 0 --cpu-method all --timeout 300s
# 监控命令
while true; do clear; uptime; mpstat -P ALL 1 1 | tail -n +4; sleep 2; done1.13 docker 查看容器数据卷文件大小排序
bash
for container in `docker ps | tail -n +2 | awk '{print $1}'`; do
vol=`docker inspect $container | jq .[].GraphDriver.Data.WorkDir`
directory=${vol:1:-6}
size=`du -sh $directory | awk '{print $1}'`
printf "%-15s %-10s %s\n" $container $size $directory
done | sort -k2 -h -r