Bash-Scripting - Munin 插件不起作用

Bash-Scripting - Munin 插件不起作用

我编写了一个 munin-plugin 来统计 lighttpd 的 http-statuscodes。脚本如下:

#!/bin/bash

######################################
# Munin-Script: Lighttpd-Statuscodes #
######################################

##Config
# path to  lighttpd access.log
LIGHTTPD_ACCESS_LOG_PATH="/var/log/lighttpd/access.log"
# rows to parse in logfile (higher value incrase time to run plugin. if value to low you may get bad counting)
LOG_ROWS="200000"
#
#munin
case $1 in
   autoconf) # check config
        AVAILABLE=`ls $LIGHTTPD_ACCESS_LOG_PATH`
        if [ "$AVAILABLE" = "$LIGHTTPD_ACCESS_LOG_PATH" ]; then
           echo "yes"
        else
           echo "No: "$AVAILABLE
           echo "Please check your config!"
        fi
        exit 0;;
   config) # graph config
        cat <<'EOM'
graph_title Lighhtpd Statuscodes
graph_vlabel http-statuscodes / min
graph_category lighttpd
1xx.label 1xx
2xx.label 2xx
3xx.label 3xx
4xx.label 4xx
5xx.label 5xx
EOM
        exit 0;;
esac

## calculate
AVAILABLE=`ls $LIGHTTPD_ACCESS_LOG_PATH`
if [ "$AVAILABLE" = "$LIGHTTPD_ACCESS_LOG_PATH" ]; then
   TIME_NOW=`date`
   CODE_1xx="0"
   CODE_2xx="0"
   CODE_3xx="0"
   CODE_4xx="0"
   CODE_5xx="0"
   for i in 1 2 3 4 5; do
        TIME5=`date +%d/%b/%Y:%k:%M --date "$TIME_NOW -"$i"min"`
        CODE_1xx=$(( $CODE_1xx + `tail -n $LOG_ROWS $LIGHTTPD_ACCESS_LOG_PATH | grep "$TIME5" | grep 'HTTP/1.1" 1' | grep -c " "` ))
        CODE_2xx=$(( $CODE_2xx + `tail -n $LOG_ROWS $LIGHTTPD_ACCESS_LOG_PATH | grep "$TIME5" | grep 'HTTP/1.1" 2' | grep -c " "` ))
        CODE_3xx=$(( $CODE_3xx + `tail -n $LOG_ROWS $LIGHTTPD_ACCESS_LOG_PATH | grep "$TIME5" | grep 'HTTP/1.1" 3' | grep -c " "` ))
        CODE_4xx=$(( $CODE_4xx + `tail -n $LOG_ROWS $LIGHTTPD_ACCESS_LOG_PATH | grep "$TIME5" | grep 'HTTP/1.1" 4' | grep -c " "` ))
        CODE_5xx=$(( $CODE_5xx + `tail -n $LOG_ROWS $LIGHTTPD_ACCESS_LOG_PATH | grep "$TIME5" | grep 'HTTP/1.1" 5' | grep -c " "` ))
   done
        CODE_1xx=$(( $CODE_1xx / 5 ))
        CODE_2xx=$(( $CODE_2xx / 5 ))
        CODE_3xx=$(( $CODE_3xx / 5 ))
        CODE_4xx=$(( $CODE_4xx / 5 ))
        CODE_5xx=$(( $CODE_5xx / 5 ))

        echo "1xx.value "$CODE_1xx
        echo "2xx.value "$CODE_2xx
        echo "3xx.value "$CODE_3xx
        echo "4xx.value "$CODE_4xx
        echo "5xx.value "$CODE_5xx
else
        echo "1xx.value U"
        echo "2xx.value U"
        echo "3xx.value U"
        echo "4xx.value U"
        echo "5xx.value U"
fi

如果我在本地机器上运行该脚本,它会完美运行:

root@server1 /etc/munin/plugins # ll
lrwxrwxrwx 1 root root   45 2011-12-19 15:23 lighttpd_statuscodes -> /usr/share/munin/plugins/lighttpd_statuscodes*
root@server1 /etc/munin/plugins # ./lighttpd_statuscodes autoconf
yes
root@server1 /etc/munin/plugins # ./lighttpd_statuscodes config
graph_title Lighhtpd Statuscodes
graph_vlabel http-statuscodes / min
graph_category lighttpd
1xx.label 1xx
2xx.label 2xx
3xx.label 3xx
4xx.label 4xx
5xx.label 5xx 
root@server1 /etc/munin/plugins #./lighttpd_statuscodes
1xx.value 0
2xx.value 5834
3xx.value 1892
4xx.value 0
5xx.value 0 

但是 Munin 没有展示任何图表:http://s1.directupload.net/images/111219/3psgq3vb.jpg

我已经通过 telnet 从 munin-server 测试了插件:

root@munin-server /etc/munin/plugins/ # telnet 123.123.123.123 4949
Trying 123.123.123.123...
Connected to 123.123.123.123.
Escape character is '^]'.
# munin node at server1.cluster1
fetch lighttpd_statuscodes
1xx.value U
2xx.value U
3xx.value U
4xx.value U
5xx.value U
.
Connection closed by foreign host.

您可以在脚本中看到,当脚本无法检查 lighttpd 的 access.log 时,才会打印 value = U。但是,为什么通过 munin 运行时脚本无法做到这一点,而在本地计算机上运行时一切正常?

我的 bash 脚本中是否有错误?我不知道。谢谢您的帮助!

答案1

不要只通过直接运行脚本来检查 munin 脚本。这是错误的方法。有一个特殊的 perl 脚本,munin-run它以与 munin 更新期间运行的方式完全相同的方式执行脚本,您将能够找到所有错误。您可能需要为脚本定义特殊设置。您可以在/etc/munin/plugin-conf.d/munin-node文件中以以下方式执行此操作:

[script_file_mask_*]
user USER_FOR_YOR_SCRIPT
env.VARIABLE some_variable

在你的情况下,脚本似乎还没有准备好读取日志文件。因此添加

[lighttpd_*]
user root

/etc/munin/plugin-conf.d/munin-node重新启动 munin-node。这应该有帮助。

答案2

我不知道您是否曾经自己解决过这个问题,但我解决了,并且我想分享我的解决方案。

Rush 建议以 root 身份运行是正确的,但真正的错误似乎在于你对字段名称的选择(1xx、2xx、3xx……)。根据此维基页面

插件中的每个数据源必须通过字段名来标识。字段名的描述如下:
* 字符必须是 [a-zA-Z0-9_],第一个字符必须是 [a-zA-Z_]

这就是为什么您在图表中只能看到 5xx 而看不到结果的原因。在创建 rdd 文件时,munin 将数字替换为下划线(如 _xx),这意味着 5 个字段的数据都被覆盖了。简单的解决方法是将字母添加到字段名称中,如下所示:

graph_category lighttpd
T1xx.label 1xx
T2xx.label 2xx
T3xx.label 3xx
T4xx.label 4xx
T5xx.label 5xx
EOM

        echo "T1xx.value "$CODE_1xx
        echo "T2xx.value "$CODE_2xx
        echo "T3xx.value "$CODE_3xx
        echo "T4xx.value "$CODE_4xx
        echo "T5xx.value "$CODE_5xx
else
        echo "T1xx.value U"
        echo "T2xx.value U"
        echo "T3xx.value U"
        echo "T4xx.value U"
        echo "T5xx.value U"
fi

这样我就能让你的脚本完美地运行。

答案3

报到/etc/munin/munin-node.confmunin 下运行的用户名是什么,以及该用户是否可以读取 lighttpd 日志文件。

相关内容