Skip to content

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 telnet

1.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 restart

1.6 linux下查看网址经过路由的命令

bash
traceroute www.163.com
traceroute 114.114.114.114

centos/openeuler 系统上安装traceroute命令

bash
yum install traceroute

ubuntu 系统上安装traceroute命令

bash
apt install traceroute

1.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
EOF

1.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 sshd

1.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';

1.11 nvm 报错try nvm ls-remote to browse available versions.

(macOS/Linux): 添加到你的 Shell 配置文件 (~/.zshrc 或 ~/.bashrc 或 /etc/profile)

bash
vim /etc/profile
#加速nvm
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node

source /etc/profile

windows 在 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, &current_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; done

1.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
最近更新

采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 运维小弟