shell脚本自动终止符合特定条件的进程

shell脚本自动终止符合特定条件的进程

运行时top显示几个进程的 'perl' 命令的 cpu 使用率接近 100%

    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 21287  simon      15   0  4141  231 5891 S  90.3  0.0  14:27.50 perl
 22545 albert      15   0 12744 1172 8321 S  99.0  0.0  20:00.58 perl
        ...
        ...

lsof -p <pid>估计它是否是恶意进程(通常在管道中的某个地方,它尝试使用本地端口> 50000连接到外部IP地址)

kill -9 <pid>单独杀死那些恶意进程

然后重复上面的操作

理想情况下,我想自动终止以下进程:

  • 上面显示的用户
  • 已运行超过 15 分钟
  • CPU使用率超过90%。
  • 具有出站 tcp 连接(如果可能)

有人碰巧有一个方便的脚本吗?谢谢!

答案1

实际上我没有方便的脚本,但是杀死这些恶意进程不会解决你首先遇到的问题......我猜你是一个网络主机,这些是在你的 VPS 上运行的矿工?

你能做的不是杀死他们,而是使用“饿死他们”cgroups

您将在那里拥有 CPU 和网络记帐以及一个名为 的工具cgclassify。您可以构建灵活的层次结构。 CentOS/RHEL 有一些很好的文档这里

我不是细节方面的专家,但我认为通过这种方式是可能的:您为 CPU/内存/网络创建 cgroup,并使用 cgclassify 或提及守护程序根据使用的共享对进程进行分类。这意味着守护进程负责监督资源使用情况,您可以将使用网络和一定量 CPU 份额的进程移动到 cgroup 中,这会严重限制 CPU 和网络访问或直接终止进程(例如,由于内存不足) 。

这是一个演示文稿一些细节

每 15 分钟终止这些进程的问题在于,这些进程可能会立即重新生成,并且它们会在这 15 分钟内占用您的全部资源。

使用 cgroups,您可以对某些安全二进制文件(例如 PHP、Apache)进行分类并限制所有其他进程...因此使用 CPU/网络不会影响服务器,而且速度太慢,用户不值得运行这些任务。也可以以这样的方式调整 CPU 份额,即进程使用的 CPU 越多,速度就会变慢。网络带宽也是如此。您可以限制每个用户的所有进程仅使用 1Mbit 进行传出网络连接,甚至更少。

您还可以仅使用 cgroup 中的记帐数据来终止进程。

“即时”执行此操作看起来像是另一个问题,但如果问题持续存在,请考虑使用和修改ulatencyd或满足您需求的类似工具。有了良好的规则,这应该可以在 15 分钟内更快地处理有问题的流程,并且具有一定的持久性。

相关内容