【问题标题】:Changing Process Name using Shell for nagios monitoring with check_procs使用 Shell 更改进程名称以使用 check_procs 进行 nagios 监控
【发布时间】:2012-02-18 15:51:55
【问题描述】:

我有一个 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 执行它。

问候,

卫生巾

【问题讨论】:

  • 您想使用 shell 来启动 Python 脚本,而该脚本又会启动另一个进程。但是,您希望 shell 使用与您实际提供给 shell 的进程名称和参数不同的进程名称和参数来启动原始 Python 进程。对吗?
  • 是的..这正是我想要达到的目标!!
  • check_procs 比只看 ps 'command' 输出更聪明。如果您使用#!,它已经可以检测到名称!你的python中的行并直接执行它们。 [完全没有记录在手册页中:( ]。见我的回答:stackoverflow.com/a/10232406/117714

标签: python shell ubuntu process nagios


【解决方案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)

【讨论】:

    【解决方案2】:

    您可以使用 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

    【讨论】:

      【解决方案3】:

      您可以使用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')
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            can't change the process name 来自纯 Python,尽管您可以使用包装器(例如,用 C 编写)来执行此操作。

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

            【讨论】:

            • 这是识别正确进程的更好方法 - 如果您还没有编写 PID 文件,那么这只是您应该这样做的众多原因之一。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多