![获取 CPU 使用率,如果高于 80% 则运行命令](https://linux22.com/image/125629/%E8%8E%B7%E5%8F%96%20CPU%20%E4%BD%BF%E7%94%A8%E7%8E%87%EF%BC%8C%E5%A6%82%E6%9E%9C%E9%AB%98%E4%BA%8E%2080%25%20%E5%88%99%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4.png)
我的VPS被黑了好几次,黑客放了一个CPU矿机。如果检测到矿工并且我在接下来的 12 小时内没有做出反应,我的托管提供商会关闭 VPS。但他们可以在周六晚上 21 点向我发送通知:),并在周日上午 9 点关闭服务器。
所以我想监控CPU使用情况和矿工总是从写入中发现的块文件夹。
我对Linux不太熟悉,所以请建议这样的脚本
- 检查 CPU 使用率,如果高于 80%(例如),请执行某些操作。
- 就我而言 - 从安装文件夹中删除所有内容并使其只读。
实际上我不知道如何实施第1项。
答案1
我遇到了类似的问题,并且bash
已经完成了这个简短的脚本。它正在计算最后 15 分钟的平均负载,如果您想要不同的时间范围,则应更改它(要检查最后 5 分钟的平均负载,请将 更改为awk
)print $1
。
这将告诉您 CPU 的相对使用情况:
#!/bin/bash
cores=$(nproc)
load=$(awk '{print $3}'< /proc/loadavg)
echo | awk -v c="${cores}" -v l="${load}" '{print "relative load is " l*100/c "%"}'
应该在 Ubuntu 和 Centos 上运行。
要检查负载是否高于 80% 并“执行某些操作”,您应该添加到此脚本中:
usage=$(echo | awk -v c="${cores}" -v l="${load}" '{print l*100/c}' | awk -F. '{print $1}')
if [[ ${usage} -ge 80 ]]; then
echo "delete all from install folder and make it read only"
fi
答案2
检查 CPU 使用率,如果高于 80%(例如),请执行某些操作。
现代 CPU 具有多个核心,并且通常每个核心都支持多个线程。此外,内核通常具有可变的时钟速度。那么定义如何计算 CPU 负载就没那么简单了。更不用说单个 vCPU 在任何给定时间只能处于 100% 空闲或 100% 繁忙状态。不存在 CPU 瞬时繁忙到 80% 的情况。
您可以做的是获取一段时间内每个 vCPU 的平均负载(mpstat 提供)或所有 vCPU 组合的平均值 (vmstat)。
即使完全受 CPU 限制,如果敌对 CPU 使用者是单线程的,它也可能不会在后一种情况下明显出现,因为其他 vCPU 可能处于空闲状态。
如果是多线程且受 CPU 限制,则两个命令都会检测到它,但您必须确保它不是正在加载您的计算机的合法应用程序或守护程序。
另一个更有用的指标来自 CPU 争用,即测量有多少线程正在使用和争用 vCPU 资源。这就是平均负载旨在显示的内容。不幸的是,在 Linux 上,平均负载将线程不可中断状态视为 CPU 负载,而实际上,CPU 处于空闲状态并可以自由执行其他任务,因此您应该注意该因素并识别平均负载较高但实际争用较低的潜在情况。
最后,可能存在运行队列非常高但时间非常有限的情况。如果使用采样来获取运行队列值的负载平均计算恰巧在这个高峰时刻取号,则负载平均值将在几分钟或几十分钟内出现严重偏差。