从 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.
使用此代码,我使用 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.