我使用Zabbix的zabbix_sender.sh
脚本将exception堆栈跟踪推送到远程Zabbix监视服务器。
zabbix_sender.sh
需要一个键和它发送的任何数据的值。 它可以从stdin
读取数据,但是这会覆盖指定的任何关键variables。 因为我的stdin
数据不像Zabbix所期望的那样格式化,所以我需要传入“值”作为参数。 希望这提供了一些上下文。
我想要完成的是将grep
的多行结果捕获到一个variables中,保留换行符,以便我可以用该variables作为参数调用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
。
为了testing,我试过使用这个命令,这似乎也不工作:
tail -Fn0 /var/log/uwsgi.log | grep "Exception:" -A 100 | (read errorlines; echo "$errorlines" > /tmp/errorlines.txt)
/tmp/errorlines.txt
文件永远不会被创build。
如何将grep
的输出行捕获到一个variables中,以便我可以用该variables调用另一个脚本作为参数?
问题是尾巴部分; 因为它处于连续模式,所以不会吐出“读”的东西来读。
这应该工作:
#!/bin/bash echo "0" >/tmp/numberoflines IFS='' while [ 1 ] do NUMBER=$(cat /tmp/numberoflines) LINES=$(wc -l < /var/log/uwsgi.log) DIFFERENCE=$(($LINES-$NUMBER)) if [ $DIFFERENCE != 0 ]; then exception=$(tail -n $DIFFERENCE /var/log/uwsgi.log | grep "Exception:" -A 100) /zabbix/bin/zabbix_sender -z myzserver.com -s MyHostName -k uwsgi_traceback -o $tback) $exception; fi sleep 5; echo "$LINES" >/tmp/numberoflines done
在这里我的做法。
这种方法的优点是:
让我来解释一下如何设置的细节:
注1:上述步骤中的密钥名称“my_app.fetch_uwsgi_log”就是例子。 我们可以定义任何唯一的名字来绑定zabbix_sender和项目。
注2:您可能需要/etc/zabbix/zabbix_agentd.conf上的AllowRoot = 1来允许zabbix-agent读取uwsgi.log。
您必须closuresbash中的单词分割 ,例如通过清除IFS:
export IFS="" set NEWVAR=`your tail|grep expression`
现在echo $NEWVAR
有换行符。