我有一个失控的红宝石进程 - 我确切地知道如何触发它。
重点是,它让我开始思考失控的进程(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。