首页 > 解决方案 > 从 os.system-Zabbix trapper 获取输出

问题描述

使用此代码,我使用 trapper 向 zabbix 发送数据:

def zabbix_sender(key, output):
    server = "1.2.2.4"
    hostname = "host"
    cmd = "zabbix_sender -z " + server + " -s " + hostname + " -k " + key +\
            " -o \"" + output +"\""
    print os.system(cmd)

它将这个输出到屏幕上

info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.000041"
sent: 1; skipped: 0; total: 1

failed: 1如果我可以创建错误处理,我需要将上面的输出输出到变量。

目前我在调用这个函数时得到 0 作为输出:

r = zabbix_sender (key,"failed")
                print  r

输出:0

尝试使用子流程:

r=subprocess.check_output(zabbix_sender (key,"failed"),shell=False) 
print r

TypeError:None 对象不可迭代

标签: pythonpython-2.7zabbix

解决方案


from 的返回值os.system()不是命令的输出。你想subprocess.run()改用。

from subprocess import run, PIPE

def zabbix_sender(key, output):
    server = "1.2.2.4"
    hostname = "host"
    cmd = ["zabbix_sender", "-z", server, "-s",  hostname,
        "-k", key, "-o",  output]
    result = run(cmd, stdout=PIPE, stderr=PIPE
        universal_newlines=True, check=True)
    return result.stdout, result.stderr

另请注意,-o当您不使用时,您不希望在 option 参数周围引用shell=True,以及原始函数将如何print代替return结果。

我推测您想要的输出在标准错误上,而不是标准输出上;但我把这留给你来确定。

如果zabbix_sender完全正确实现,如果失败,它将返回一个非零退出代码;你应该处理这个而不是检查它的人类可读的输出。如果被调用进程返回失败状态,check=True则会引发异常。

def zabbix_sender(key, output):
    server = "1.2.2.4"
    hostname = "host"
    try:
        result = run(["zabbix_sender", "-z", server, "-s", hostname,
            "-k", key, "-o", output],
            stdout=PIPE, stderr=PIPE,
            universal_newlines=True, check=True)
         return result.stdout, result.stderr
    except CalledProcessError:
         # your zabbix error handling here
         # then probably
         return None

如果你在 3.5 之前被 Python 卡住了,你可以试试subprocess.check_output和朋友。在 Python中运行 Bash 命令的更多信息。


推荐阅读