我有一个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
答案 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')