你好,我正在寻找一个适用于 CentOS 6.5 的 BASH 脚本,该脚本可以按名称终止运行时间超过 5 分钟的进程。我之前问过这个问题,得到的答复是它在 CentOS 下不起作用,因为 killall 没有 --older-than。我正在寻找一个可以在 CentOS 下工作的等效脚本。
该帖子位于此处:在 CentOS 6.5 上终止任何运行超过 5 分钟的 GS 进程
谢谢!
答案1
我真的建议找到根本原因这个问题(或者这个问题或者这个问题)。
Akillall
是一种过于严厉的流程管理方法,而您的真正问题可能是应用程序或资源问题。
您能概述一下您到目前为止尝试过的方法吗?我要检查的内容包括:
- 这些失控的 Ghostscript 进程发生时的系统生命体征:RAM?CPU?
- 确保运行该系统的系统具有足够的内存并且不会对其他资源产生重大争用。
- 这是物理服务器还是虚拟服务器?
- 与供应商交谈。有一个社区和一定程度的支持围绕 PrinceXML。
strace
受影响的 PID 和父 PID 的可能性。- 所有必需的字体都安装了吗?
- 尝试记录发生这种情况的时间,看看挂起与其他系统事件之间是否存在关联。
- 如果你没有历史和精细监控,你应该这样做。你甚至可以尝试新Relic试图了解某一特定时间正在发生或者已经发生的事情。
- 检查 apache 设置。看起来 Ghostscript 是由 apache 用户生成的。这里是否有任何限制或服务器设置需要检查?
基于你之前问题的答案,看起来您只为该系统分配了 1 GB 的 RAM,并且可能只有一个 CPU - 也没有交换...
如果其他方法都失败了,您可以编写一个脚本来清理旧的或停滞的进程...或者只编译一个killall
支持该--older-than
标志的版本。
答案2
类似这样的事可以吗?
#!/bin/bash
PROC_NAME=my_proc_name
# Get all PIDs for process name
procs=(`ps aux | grep $PROC_NAME | awk '{print $2}'`)
# for each PID in PIDs array
for pid in $procs; do
# get elapsed time in form mm:ss and remove ":" character
# to make it easier to parse time
time=(`ps -o etime $pid | sed -e 's/[:-]/ /g'`)
# get minutes from time
min=${time[1]}
# if proces runs 5 minutes then kill it
if [ "$min" -gt "5" ]; then
kill -9 $pid
fi
done;
当然它应该由 cron 或者类似的东西来执行,以定期检查进程。