使用Shell更改进程名称以便通过check_procs监控nagios
我有一个Python脚本,用来启动一个我想用Nagios监控的进程。当我在我的Ubuntu EC2实例上运行这个脚本,并执行ps -ef
命令时,看到的进程显示为python <filename>.py --arguments
。为了让Nagios通过check_procs监控这个进程,我们需要提供进程的名称。在这里,进程的名称就是'python'。
/usr/lib/nagios/plugins/check_procs -C python
这个命令返回的结果是有一个Python进程在运行。这在我只运行一个Python进程的时候是没问题的。但是如果我同时运行多个Python脚本,并且只想监控其中的一些,那我就得提供那个特定的进程名称。如果在上面的命令中,我给出Python脚本的名称,就会报错。所以我想把整个python <filename>.py --arguments
换成一个其他的名字,这样在执行check_procs的时候,我就可以用那个新名字。
如果有人有任何想法,请告诉我。我查过其他的StackOverflow问题,有人建议使用setproctitle来改变Python进程的名称,但我想用shell来实现。
谢谢,
Sanket
6 个回答
check_procs已经处理了这种情况。
check_procs可以区分通过解释器作为参数启动的脚本和直接通过哈希bang解释器运行的任务。虽然在ps输出中这两者看起来是一样的!!但是后者不会出现在check_procs -C python
的列表中!
如果你通过python明确运行你的脚本:python <filename.py>
,那么你可以用check_procs -C python -a filename.py
来监控它们。
如果你在脚本中加上#!/usr/bin/python
,然后通过./filename.py
来运行它们,那么你可以用check_procs -C filename.py
来监控。
下面是一个命令行会话的示例,展示了这种行为:
#make test.py directly executable. See code below
$ chmod a+x test.py
#launch via python explicitly:
$ /usr/bin/python ./test.py &
[1] 27094
$ check_procs -C python && check_procs -C test.py && check_procs -a test.py
PROCS OK: 1 process with command name 'python'
PROCS OK: 0 processes with command name 'test.py'
PROCS OK: 1 process with args 'test.py'
#launch via python implicitly
$ ./test.py &
[2] 27134
$ check_procs -C python && check_procs -C test.py && check_procs -a test.py
PROCS OK: 1 process with command name 'python'
PROCS OK: 1 process with command name 'test.py'
PROCS OK: 2 processes with args 'test.py'
#PS 'COMMAND' output looks the same
$ ps 27094 27134
PID TTY STAT TIME COMMAND
27094 pts/6 S 0:00 /usr/bin/python ./test.py
27134 pts/6 S 0:00 /usr/bin/python ./test.py
#kill the explicit test
$ kill 27094
[1] - terminated /usr/bin/python ./test.py
$ check_procs -C python && check_procs -C test.py && check_procs -a test.py
PROCS OK: 0 processes with command name 'python'
PROCS OK: 1 process with command name 'test.py'
PROCS OK: 1 process with args 'test.py'
#kill the implicit test
$ kill 27134
[2] + terminated ./test.py
$ check_procs -C python && check_procs -C test.py && check_procs -a test.py
PROCS OK: 0 processes with command name 'python'
PROCS OK: 0 processes with command name 'test.py'
PROCS OK: 0 processes with args 'test.py'
test.py是一个python脚本,它会睡眠2分钟。它的权限设置为可执行(chmod +x),并且有一个哈希bang #!
行调用/usr/bin/python。
#!/usr/bin/python
import time
time.sleep(120)
你不能直接用纯Python来改变进程的名字,不过你可以用一个包装器(比如用C语言写的)来实现这个功能。
不过,建议你做的是把你的程序变成一个守护进程,并使用一个pid文件。可以看看 Python守护进程API 以及它的实现 python-daemon。
你可以使用check_procs命令来查看进程的参数,这些参数包括模块名称。下面这个命令可以告诉你名为'module.py'的python模块是否正在运行。
/usr/lib/nagios/plugins/check_procs -c 1:1 -a module.py -C python
其中,-c参数可以让你设置一个关键范围。如果运行的进程数量少于或多于1个,就会触发一个关键状态。
而-a参数则是用来过滤那些包含'模块.py'这个参数的进程(你可以把它改成你想监控的模块名称)
-C参数则确保这个进程是一个python进程。
如果你需要帮助来创建服务定义,我也曾经遇到过这个问题。如果需要的话,随时告诉我。
参考资料: check_procs插件手册 http://nagiosplugins.org/man/check_procs