Я использую 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
строки вывода в переменную, чтобы я мог вызвать другой сценарий с этой переменной в качестве аргумента?
Вот мой подход.
Преимущества такого подхода:
Позвольте мне подробно объяснить, как настроить ниже:
ПРИМЕЧАНИЕ-1: имя ключа «my_app.fetch_uwsgi_log» на шаге выше является всего лишь примером. Мы можем определить любое уникальное имя для привязки zabbix_sender и элемента.
ПРИМЕЧАНИЕ-2: Вам может потребоваться AllowRoot = 1 в /etc/zabbix/zabbix_agentd.conf, чтобы разрешить zabbix-agent читать uwsgi.log.
Вы должны выключить разбиение слов в bash, например, очистив IFS:
export IFS=""
set NEWVAR=`your tail|grep expression`
Сейчас echo $NEWVAR
есть символы новой строки.
Проблема в хвостовой части; поскольку он находится в непрерывном режиме, он никогда не выдаст что-нибудь для «чтения».
Это должно работать:
#!/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