从 os.system-Zabbix trapper 获取输出

get output from 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

类型错误:None对象不可迭代

os.system() 中的 return 值不是命令的输出。您想改用 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

另请注意,当您不使用 shell=True 时,您不想在 -o 的选项参数周围引用,以及您的原始函数如何 print 而不是 return结果。

我推测你想要的输出是stderr,而不是stdout;但我把这个留给你来确定。

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

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 和朋友。更多信息请见 Running Bash commands in Python.