3

我有一个 python 脚本来启动我想使用 Nagios 监控的进程。当我运行该脚本并ps -ef在我的 ubuntu EC2 实例上执行时,它显示进程为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 执行它。

问候,

桑克

4

6 回答 6

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

于 2012-02-28T18:41:36.957 回答
2

无法从纯 Python 更改进程名称,但您可以使用包装器(例如,用 C 编写)来执行此操作。

然而,你应该做的是让你的程序成为一个守护进程,并使用一个 pidfile。查看python Daemon API及其实现python-daemon

于 2012-01-25T13:09:56.937 回答
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)
于 2012-04-19T16:19:45.410 回答
0

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

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

使用该链接启动的脚本应显示mypythonps.

于 2012-01-25T18:39:07.327 回答
0

创建一个 pid 文件并将该文件用于 nagios 的进程查找。

于 2012-01-25T13:12:12.100 回答
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')
于 2012-01-26T16:41:22.013 回答