如何监视单个进程?

我需要监视一个单独的进程(例如,当有超过3000个连接build立的时候会被警告)并且收集统计信息(例如,确定今天早上01:20build立了多less个连接,当服务器工作得太慢,就像客户端说的那样)。 我应该使用什么工具?

如果你不想去一个完整的Nagios(或其他)来监控一个进程,为什么不写一个脚本来自己做呢? 我已经做了类似的事情来跟踪我们的一个盒子的数据库连接,使用netstat的输出来进行计数并将结果logging到一个文件中。 如果计数> 3000,那么添加额外的几行来发送电子邮件应该是微不足道的。

这可能不是最复杂的解决scheme,但是 – 特别是如果你没有其他进程打开这么多的套接字 – 你可以检查输出

netstat -nutp 

(n:没有名称parsing,t:TCP,u:UDP,p:显示PID和程序 – 根据你的进程是否打开UDP或TCP连接,你可能只想提供u或t中的一个)。

你可以从输出grep的pid:

 netstat -nutp | grep -c ' 12345/progname$' 

其中'12345'应该用你的PID和'progname'replace你的进程的名字。 grep选项-c会计算匹配项。 您可能想要精确search以更准确地匹配您的需求(例如,仅包括ESTABLISHED连接)。

另外'lsof'可能是你的朋友。 你可以试试

 lsof -p 12345 -a -i4 

并检查输出,并做一些grepping。 查看lsof手册页,看看是否可以修改输出格式以更好地适合脚本parsing。

您可以编写一个简单的脚本来定期运行该命令。 对于数量巨大的连接,您最好试验运行netstat或lsof的资源数量,并调整间隔。 例如每分钟一次(默认):

 #!/bin/sh prog=progname if [ -z "$1" ]; then interval=60 else interval="$1" fi pid=$(pidof $prog) while :; do n=$(netstat -nutp | grep -c " ${pid}/${prog}$') date +"Number of connections [%Y-%m-%d %H:%M:%S]: $n" > connection.log if [ "$n" -gt $TRESHOLD ]; then # warn the admin fi sleep "${interval}" done 

(相当无用,只是提供想法)。

如果你想警报和监控,那么我会看看Nagios,如果你想要纯图,那么我会看看Munin或仙人掌 。 如果你只是想知道一个进程在任何时候打开了多less个连接,那么使用lsof。

您可以使用现成的解决scheme, ps-watcher

你的configuration可以是这样的:

 [processname$] trigger = $count > 3000 action = <<EOF mail -s "processname treshold exceeded" <<< "You have $count processes" /root/bin/run_some_cleanup EOF [[p]rocessname$] action = echo "$count processes are running" 

当进程计数超过阈值时,这将邮件给你。 第二部分有不同的正则expression式匹配相同的进程名称,它logging进程的数量。 由于它不受任何触发器的限制,动作在每个ps-watcher检查中运行。 您可以使用“–sleep 150”选项将检查间隔更改为ps-watcher。

我会安装munin并编写一个插件来监视一个特定的过程或服务的具体行为。