使用Shell更改进程名称以使用check_procs进行nagios监视

时间:2012-01-25 12:59:50

标签: python shell ubuntu process 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 个答案:

答案 0 :(得分:4)

您可以使用check_procs命令查看包含模块名称的参数。如果python模块'module.py'正在运行,以下命令将告诉您。

/usr/lib/nagios/plugins/check_procs -c 1:1 -a module.py -C python

-c参数允许您设置临界范围。如果有多于或少于1个进程匹配运行,则1:1将触发临界状态。

-a参数将根据包含args'module.py'的进程进行过滤(将其更改为您要监视的模块的名称)

-C参数将确保该进程是一个python进程

如果您需要帮助找出如何创建服务定义,我也必须弄清楚。请告诉我。

参考: check_procs插件联机帮助页 http://nagiosplugins.org/man/check_procs

答案 1 :(得分:2)

来自纯Python的can't change the process name,尽管你可以使用包装器(例如,用C语言编写)来实现这一点。

但是,你应该做的是让你的程序成为守护进程,并使用pidfile。请查看python Daemon API及其实施python-daemon

答案 2 :(得分:1)

check_procs已经处理了这种情况。

check_procs可以告诉作为解释器的参数启动的脚本与直接运行hashbang解释器的作业之间的区别。即使这两个在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是一个睡眠2分钟的python脚本。它是chmod + x并且有一个hashbang #!行调用/ usr / bin / python。

#!/usr/bin/python
import time
time.sleep(120)

答案 3 :(得分:0)

创建一个pid文件,并使用该文件进行nagios进程查找。

答案 4 :(得分:0)

我不是说这是最好的解决方案(根本不能很好地扩展),但您可以创建一个指向python命令的符号链接并使用此链接执行您的脚本。 e.g。

ln -s `which python` ~/mypython
~/mypython myscript.py

使用该链接启动的脚本应在mypython中显示为ps

答案 5 :(得分:0)

您可以使用subprocess.Popen更改可执行文件名,但您必须使用包装器脚本(或一些奇怪的fork魔法)。以下代码会导致ps将可执行文件列为kwyjibo /tmp/test.py而不是/usr/bin/python /tmp/test.py

import subprocess
p = subprocess.Popen(['kwyjibo', '/tmp/test.py'], executable='/usr/bin/python')