我正在使用 Zabbix 的zabbix_sender.sh
脚本将异常堆栈跟踪推送到我的远程 Zabbix 监控服务器。
zabbix_sender.sh
它发送的任何数据都需要一个键和一个值。它可以从 读取数据stdin
,但这会覆盖任何指定的键变量。因为我的stdin
数据没有像 Zabbix 期望的那样格式化,所以我需要传入“值”作为参数。希望这提供了一些背景信息。
我想要完成的是将多行结果捕获grep
到一个变量中,保留换行符,以便我可以zabbix_sender.sh
使用该变量作为参数调用脚本。
到目前为止我尝试过的看起来像这样:
tail -Fn0 /var/log/uwsgi.log | grep "Exception:" -A 100 | (read tback; /usr/local/zabbix/bin/zabbix_sender -z myzserver.com -s MyHostName -k uwsgi_traceback -o $tback)
据我所知,这永远不会调用zabbix_sender.sh
.
为了测试,我试过使用这个命令,它似乎也不起作用:
tail -Fn0 /var/log/uwsgi.log | grep "Exception:" -A 100 | (read errorlines; echo "$errorlines" > /tmp/errorlines.txt)
永远不会创建该/tmp/errorlines.txt
文件。
如何将grep
的输出行捕获到变量中,以便我可以使用该变量作为参数调用另一个脚本?
这是我的方法。
这种方法的优点是:
让我在下面解释如何设置的详细信息:
NOTE-1:上述步骤中的键名“my_app.fetch_uwsgi_log”只是示例。我们可以定义任何唯一的名称来绑定 zabbix_sender 和 item。
NOTE-2:您可能需要在 /etc/zabbix/zabbix_agentd.conf 上设置 AllowRoot=1 以允许 zabbix-agent 读取 uwsgi.log。
您必须在 bash 中关闭分词,例如,通过清除 IFS:
现在
echo $NEWVAR
有了换行符。问题是尾部;因为它处于连续模式,所以它永远不会吐出一些东西供“阅读”阅读。
这应该有效: