我在 Ubuntu 14.04 上尝试运行
/usr/lib/nagios/plugins/check_procs -C rsyslogd -w 1:3 -c 1:5 -s S
然后它返回
PROCS CRITICAL: 0 processes with command name 'rsyslogd', STATE = S | procs=0;1:3;1:5;0;
因此我运行-vvv
并发现check_procs
使用该命令/bin/ps axwwo 'stat uid pid ppid vsz rss pcpu etime comm args'
列出进程。我找到了我的 rsyslogd 进程,它列出如下:
Ssl 101 406 1 256232 25392 0.0 157-05:57:14 rsyslogd rsyslogdproc#=0 uid=101 vsz=256232 rss=25392 pid=406 ppid=1 pcpu=0.00 stat=Ssl etime=157-05:57:14 prog=rsyslogd args=rsyslogd
查看该命令的帮助,它显示:
-s, --state=STATUSFLAGS Only scan for processes that have, in the output of `ps`, one or more of the status flags you specify (for example R, Z, S, RS, RSZDT, plus others based on the output of your 'ps' command).
所以它确实应该可以工作。为了测试,我尝试运行
/usr/lib/nagios/plugins/check_procs -C rsyslogd -w 1:3 -c 1:5 -s Ssl
此命令返回我期望从第一个命令得到的结果:
PROCS OK: 1 process with command name 'rsyslogd', STATE = Ssl | procs=1;1:3;1:5;0;
check_procs 是 v1.5。
我在 RHEL 6.5 服务器上运行着相同的测试命令,所以我猜它可能是 Ubuntu 独有的。
答案1
查看 check_procs 的源代码,您看到的行为是设计使然。或者更确切地说,该行为完全取决于实现的行为ps
。(如果它在您的 RHEL 系统上运行,那几乎肯定是一个幸运的巧合。)
该插件必须使用ps
(而不是在 /proc 中挖掘)以允许它在没有 /proc 的系统上运行(例如非 Linux)。
抓取ps
输出后,插件调用strstr
来查看进程状态是否包含在命令行参数 -s 中。因此,在您的示例中,它正在检查“Ssl”是否是“S”的子字符串。
这似乎是倒退的逻辑,例如,它应该检查你的参数“S”是否是“Ssl”的子字符串,但我相信其目的是让你向 -s 提供多个进程状态作为参数。
例如,你可以这样做:
check_procs -C rsyslogd -w 1:3 -c 1:5 -s S,Ssl,Sl
PROCS OK: 1 process with command name 'rsyslogd', STATE = S,Ssl,Sl
逗号只是为了使其更具可读性;插件实际上会忽略它们。