我在 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 的。
查看 check_procs 的源代码,您看到的行为是设计使然。或者更确切地说,行为完全取决于
ps
实现的行为。(如果它适用于您的 RHEL 系统,那几乎可以肯定是一个快乐的巧合。)插件必须使用
ps
(而不是在 /proc 中挖掘)以允许它在没有 /proc 的系统上运行(例如,非 Linux)。抓取
ps
输出后,插件调用strstr
以查看进程状态是否包含在 -s 的命令行参数中。因此,在您的示例中,它正在检查“Ssl”是否是“S”的子字符串。这似乎是向后的逻辑,例如,它应该检查您的 arg“S”是否是“Ssl”的子字符串,但我相信您的目的是为您提供多个进程状态作为 -s 的 arg。
例如,您可以这样做:
逗号只是为了使其更具可读性;该插件有效地忽略了它们。