cronjob 监视失控进程并杀死它们

cronjob 监视失控进程并杀死它们

我有一个失控的红宝石进程 - 我确切地知道如何触发它。

重点是,它让我开始思考失控的进程(CPU 使用率或内存使用率)。

  • 如何使用 cron 监控失控进程? grep / 顶部 / ulimit?


  • 如果发生这样的事情,可以通过命令行通知用户吗

  • Monit 有哪些替代方案?

答案1

您可以使用很不错公用事业。它的主要重点是动态进程重整,但它也可以选择终止失控进程并且易于配置。

答案2

更传统的方法是通过施加硬性限制ulimit——它甚至可以阻止叉子炸弹。正如 Marcel Stimberg 所说,verynice 是一个类似的实用程序,但仅关注良好的价值,而不是限制您的问题中包含的内存使用。

答案3

下面是一个脚本,它查找所有 CPU 时间超过 3 小时的进程,然后杀死它们。第一个awk命令过滤进程 - 这里是那些不属于 root 的进程。我们首先向所有这些进程发送终止信号(-TERM),以便要求它们顺利退出。如果 3 秒后它们仍然存在,我们会在没有交互的情况下杀死它们 ( -KILL)。

#!/bin/tcsh

# Get a list of all processes that are not owned by root
set processes = `ps -ef --no-headers | awk '($1 != "root") {print $2}'`

# Iterate over the list of processes and set TERM signal to all of them
foreach process ($processes)
    # Get the CPU time of the current process
    set cputime = `ps -p $process --no-headers -o cputime | tail -n 1`
    # Convert the CPU time to hours
    set cputime_hours = `echo $cputime | awk -F: '{print $1+0}'`
    # If the CPU time is greater than 3 hours, kill the process
    if ($cputime_hours >= 3) then
        kill -TERM $process
    endif
end

# Give them time to exit cleanly
if (${%processes} > 1) then
    sleep 3
endif

# Kill those that are left
foreach process ($processes)
    # Get the CPU time of the current process
    set cputime = `ps -p $process --no-headers -o cputime | tail -n 1`
    # Convert the CPU time to hours
    set cputime_hours = `echo $cputime | awk -F: '{print $1+0}'`
    # If the CPU time is greater than 3 hours, kill the process
    if ($cputime_hours >= 3) then
        kill -KILL $process
    endif
end

以 root 身份创建该文件,例如/root/kill-old-processes.使其可执行,例如通过

chmod 750 /root/kill-old-processes

然后您可以root通过调用 (as ) 将其添加到 的 crontab中root

crontab -e

并在末尾添加以下行:

4,9,14,19,24,29,34,39,44,49,54,59  * * * * /root/kill-old-processes >> /var/log/kill-old-processes.log 2>&1

该特定行将在每天每小时的给定分钟每五分钟运行一次脚本。

简短说明:shell 脚本使用tcsh,如果尚未安装,请安装 shell。

相关内容