Perl学习笔记一

作者:Ajian 发布时间:July 31, 2009 分类:Perl

前言:实在是出于想看懂别人一些管理脚本,因为碰到大部分的PERL脚本,所以决定还是学一学这个语言,对他的评价可能也都是不一样,不管是好还是坏,是有前途还是没有前途,至于对于我现在的工作应该是很有用的。我是基于“Perl语言入门(第四版”进行的学习,我想学习语言还是脚踏实地,像我刚开始学习Shell一样,在什么都不知道的情况下,硬把一本电子书从头到尾都做了一遍笔记,也就入了shell的门。通过这次perl的学习,只要达到可以看懂那些perl脚本就行了,呵呵 至于是否会像书中说的“大多数 Perl 程序员推荐在写 Perl 程序时停止书写 shell, awk,C 程序”我就不知道了,到时真的爱上他也说不定。至于下面的笔记,就像以前在纸书上画标记一样记录下来,不要期望能从中得到什么更多更好的东西。对我应该会很有用,对于读者就不一定了。

Perl学习笔记一
Perl简介:Perl简单,几乎没有限制,速度快但有些丑。就像代表动物骆驼一样有些丑,但可以在艰苦的环境中完成任务。
CPAN简介: CPAN 是全面 Perl 归档网络(Comprehensive Perl Archive Network)的缩写。在 http://serach.cpan.org/ 和 http://kobesearch.cpan.org 上可以找到他们。
相关网站:
http://www.pm.org/
http://perldoc.perl.org
http://www.perldoc.org
http://faq.perl.org
邮件列表:http://lists.perl.org

1、简单例子
1)hello word程序
#!/usr/bin/perl
  print "Hello,word!\n";
第一行是#!行和程序的可移植性相关,需要找到每台机器的存放地点。如果有错 他的错误提示是“file not found”这个错误是SHELL提供的。

2)运行方法
./my_program
perl my_program

第二章 标量数据
1、Perl没有整数值,都视为双精度浮点来处理

2、指数的E大小写都可 -1.2E-23 -12e-24

3、61298040283768 允许用下划线分隔它 61_298_040_283_768

4、非十进制整数 八进制以 0 开头,十六进制以 0x 开头,二进制 0b 开头 十六进制中 A 到 F(或者 a 到 f)分别表示 10 到 15,同样可以用下划线分隔 0x1377_0B77   0x50_65_72_7C

5、数字操作符 Perl 除了提供通常的操作符 加(+),减(-),乘(*),除(/)等等之外:
模数运算符(%):10%3 的值是 10 除以 3 的余数
提供了和 FORTRAN 类似的指数操作符 :如 2**3,表示 2 的 3 次方,等于 8
通常不能进行一个负数的非整数次方的运算。

6、利用字符串(string)可以创建,遍历,操作二进制数据

7、单引号不是字符串的一部分, Perl 可以利用它来辨别字符串的开始和结束。反斜线(\)为转义字符。

8、如果想\和之后的字符成为转义字符(如\n 表示新行),应当使用双引号。

9、 双引号字符串中的转义符
符号                 含义
\n						换行
\r						回车
\t						制表符
\f						formfeed
\b						退格
\a						响铃
\e						escape(ASCII 中的 escape 字符)
\007					任何八进制值(这里是,007=bell(响铃))
\x7f					任何十六进制值(这里是,007=bell)
\cC						一个控制符(这里是,ctrl +c)
\\						反斜线
\”						双引号
\l						下个字符小写
\L						接着的字符均小写直到\E
\u						下个字符大写
\U						接着的字符均大写直到\E
\Q						在 non-word 字符前加上\,直到\E
\E						结束\L,\E 和\Q

10、字符串可由 . 操作符连接,(有点像PHP哦)
“hello”. “world”# 同于 “helloworld”

11、一个特殊的操作符是字符串重复操作符(string repetition operator),由小写的字母 x 表示。
“barney”x (4+1) #“barney”x 5, “barneybarneybarneybarneybarney”
复制次数(右操作数)在使用之前会把它转换为小于等于它的整数(如,4.8 变为 4)。

12、数字和字符串之间的自动转换  完全依赖于标量值之间的的操作符。
如果操作符(如+)需要数字,Perl 将把操作数当作数字看待。如果操作符需要字符串(如 . ),Perl 将把操作数当作字符串看待。
后面的非数字部分和前面的空格将被去掉,如 “12fred34”* “ 将给出 36
用首字符 0 表示非十进制值对数字有效,对自动转换没有作用。使用 hex()和 ort()来转换此类字符串。

13、$ perl -w my_program   -w警告参数
#!/usr/bin/perl -w 一直都需要警告(warning)在程序中添加

14、标量变量的名字由一个美圆符号($)后接 Perl 标识符:由字母或下划线开头,后接字母,数字,或者下划线,大小写是严格区分的。

15、标量变量在 Perl 中由$开头。在 shell 中,当取值时,需要$;赋新值时,不需要$。在 awk 和 C 中,完全不需要$。

16、大多数 Perl 程序中的变量都是小写的,应当选择能很好描述你的意图的变量名,仔细的使用下划线可以使变量名更易阅读和理解。

17、$barney= $barney*2;#将变量$barney 乘 2 再赋给$barney (40)

18、二元赋值  $fred+=5;  $barney*=3;
字符连接符号  $str = str .“ ” #$str 后接空格;
$str .= “”;#同上

19、print “ The answer is ”,6*7,“ .\n”; 利用逗号分开print输出

20、如果使用的是单独一个变量,是否使用引号没有影响。(跟SHELL是一样的)

21、在字符串中变量前($符号前)加上反斜线(\),变量将不会被内插(替换):
$fred = ‘hello’;
print “The name is \$fred .\n”;  #打印出美圆符号,变量不会被其值替换
print ‘The name is $fred’.“\n”; #同上

22、 perl中 shell 的分隔符:花括号({})  print “fred ate $n ${what}s.\n”;  #现在是使用变量$what 而不是$whats

23、操作符的优先级和结合性(由高到低)
结合性			操作符
左				括号和列表操作符的参数
左				->
				++ --(自增和自减)
右				**
右				\ ! ~ + - (一元操作符)
左				=~ !~
左				* / % x
左				+ - . (二元操作符)
左				<< >>
				Named unary operators (-X filetests, rand)
				< <= > >= lt le gt ge(“不等的”)
				= = != <=> eq ne cmp(“相等的”)
左				&
左				|^
左				&&
左				||
				..…
右				?:(三元操作符)
右				= += -= .=
左				, =>
				List operators(rightward)
右				not
左				And
左				or xor
如果记不住优先级时,可以使用括号。

24、数字和字符串的比较运算符
比较关系			数字			字符串
相等				==				eq
不等				!=				ne
小于				<				lt
大于				>				gt
小于或等于			<=				le
大于或等于			>=				ge

25、if控制结构 花括号是必须的
if($name gt 'fred'){
  print "'$name' comes after 'fred' in sorted order.\n";
}else{
  print "'$name' does not come after 'fred' .\n";
  print "Maybe it's the same string,in fact.\n";
}

26、Perl 不同于其它的一些语言,它没有 Boolean 类型。
1) 如果值为数字,0 是 false;其余为真
2)如果值为字符串,则空串('')为 false;其余为真
3)如果值的类型既不是数字又不是字符串,则将其转换为数字或字符串后再利用上述规则
字符串'0' 是唯一一个非空但值为 0 的串。
if(! $if_bigger){
}

27、如果想更多的控制输入,可以使用 Term::ReadLine 这个模块
$line = ;
if($line eq "\n" ){
}
28、基本上你的每一个程序都会用到它chomp
$text = "a line of text\n"; #也可以由输入
chomp($text);#去掉换行符(\n)。
常用方法:chomp ($text = ); #读入,但不含换行符

29、$betty = chomp $food; #得到值 1
 Perl 中的一条通用规则:除非移除它们时含义会变,否则括号是可以省略的。
如果结尾有两个或两个以上的换行符,chomp 仅去掉一个。如果没有,那什么也不做,返回 0。

30、while 控制结构
和 if 控制结构相同,花括号是必须的。

31、变量在第一次赋值前有一个特殊值 undef, undef 既非数字也非字符串,它是另一种标量类型。变量不进行初始化时、数字为0 字符串为空。

32、要分辨其是 undef 还是空串,可以使用 defined 函数,它将在为 undef 时返回 false,其余返回 true。
$madonna = ;
If ($defined ($madonna)){
print "The input was $madonna";
}else{
print "No input available!\n";
}

第三章 列表和数组
1、如果把标量认为是 Perl 中的单数的话,那列表(list)和数组则可认为是 Perl 中的复数。
2、列表是指数据,而数组是其变量名。列表中每一个元素都是一个独立的标量值。
3、perl哲学:没有不必要的限制。:最少含有 0 元素,最多可以填满你的可用内存。
4、数组索引编号从0开始$fred[0] ,同一程序也可以同时包含叫做$fred 的标量变量
5、下标可以是任何能返回数值的表达式。如果其值不为整数,则自动将其转换为小于它的最大整数值
如果下标超出了数组的范围,则其值为 undef。
6、将$#name 的值作为索引(下标)
7、列表最后一个逗号被忽略
8、(1 .. 5)  #同(1,2,3,4,5)  ..中的左值应小于右值,否则为空
(1.7 .. 5.7)#同上 小数取整数部分
9、 qw( 表示 "quoted words") 的方法可以不用输入大量的引号
("fred"," barney" ," betty","wilma","dino")
qw(fred barney betty wilma dino ) #同上,但输入更少
由于 qw 是一种引用,因此不可以在 qw 内添加注释。
 Perl 允许使用任何标点符号作为分界符  qw ! fred bar bet !   # #  { }  [ ] < >  这些符号都可以
 10、Perl 格言 : : 做一件事不只一种方法("There's More Than One Way To Do It")
 11、列表赋值
 ($fred, $barney, $dino) = ("flintstone", "rubble", undef);
左边列表中的每一个变量都得到了一个新值,和利用 3 个赋值语句得到的结果是一样的。
($fred, $barney) = ($barney, $fred) #交换两个变量
12、引用数组
在数组名前加@(后没有中括号)来引用整个数组。可以把他读作 "all of the(所有的)"
以@rocks 可以读作 "all of the rocks(所有的石头)"
@rocks = qw / bedrock slate lava /;
@copy = @quarry; #将一个数组中的值拷贝的另一个数组中
13、几种不使用索引来操作数组的方法
pop 操作将数组的最后一个元素取出并返回:
@array = 5..9;
$fred = pop(@array); #$fred 得到 9,@array 现在为(5,6,7,8)
如果数组为空,那 pop 什么也不做(因为没有元素可以移出),并返回 undef。

pop 相反的操作是 push,它可以将一个元素(或者一列元素)加在数组的末尾:
push(@array,0);#@array 现在为(5,6,0)
push @array,8;#@array 现在为(5,6,0,8)
push 的第一个参数或者 pop 的唯一参数必须是数组变量。

shift 和 unshift 操作:对一个数组的开头进行操作(数组的左端有最小下标的元素)
@array = qw# dino fred barney #;
$m = shift (@array);#$m 得到 "dino" @array 现在为("fred","barney")

14、数组也可以插入双引号的字符串中。
$email = "fred\@bedrock.edz"; #正确
$email = 'fred@bedrock.edu';  #另一种方法

15、foreach控制结构
foreach 从列表的第一个元素一直循环执行到
foreach $rock (qw/ bedrock slate lava /){
print "One rock is $rock.\n";
}
#打印出 3 种 rocks

16、 Perl 最常用的默认变量:$_
$_ = "Yabba dabba doo\n";
print;
#打印出默认变量$_。

17、 reverse 操作
reverse(逆转)操作将输入的一串列表(可能是数组)按相反的顺序返回。
@fred = 6 .. 10;
@barney = reverse (@fred); #得到 10,9,8,7,6

18、sort 操作
sort 操作将输入的一串列表(可能是数组)根据内部的字符顺序进行排序。
@rocks = sort @rocks;#现在@rocks 值是经过排序的

19、 标量和列表上下文(说是重中之重)
一个给定的表达式在不同的上下文中其含义是不同的。上下文是指表达式存在的地方.(有点像自然语言中的语言环境)
42 + something #something 必须是标量
sort something #something 必须是列表

@people = qw( fred barney betty );
@sorted = sort @people;  #列表 context:barney , betty, fred
$number = 42 + @people;  #标量 context:42+3,得到 45

@backwards = reverse qw / yabba dabba doo /;
#返回 doo, dabba, yabba
$backwards = reverse qw/ yabba dabba doo /;
#返回 oodabbadabbay

 在标量 Context 中使用 List-Producing 表达式
$fred = something; # 标量 context
@pebbles = something; #列表 context
($wilma,$betty) = something; #列表 context
($dino) = something; #列表 context 。括号是必须的,它使第四个区别于第一个。

在列表 Context 中使用 Scalar-Producing 表达式
其用法是显然的:如果一个表达式不是列表值,则标量值自动转换为一个元素的列表:
@wilma = undef;#OOPS!得到一个元素的列表(undef),不同于下面的例子
@betty = ();#将数组置空的正确方法
由于 undef 是一个标量值,将 undef 赋给数组不会清空数组。一个更好的方法是将空列表赋给它

20、在列表 Context 中
@lines = ; #将输入读入列表 context 中
当输入来源于一个文件时,它将读入文件的剩余部分。但如果输入来源于键盘,那文件结束符(end-of-file)是怎样输入的呢?
在 Unix 或者类似的系统中,包括 linux, Mac OS X,通常可以输入 CTRL +D来表明输入已经结束。Perl 会忽略这个字符,
因此它将在屏幕上显示出来。在 DOS/WINDOWS 系统中,使用 CTRL +Z。

chomp (@lines = ); #读入所有的行,不包括换行符

Nagios插件编写及调试方法(个人经验版)

作者:Ajian 发布时间:July 29, 2009 分类:管理监控维护

前言:Nagios是相当不错的监控工具,被称作是“监控之神”,但同样也有“难搞死”头衔。发挥Nagios一切魅力的都是他的插件,正因为丰富多样的插件让nagios有血有肉。监控的内容不断在变化,插件也不断变化,默认的一些插件可能越来越不能满足需求,这个时候就要自己来写些插件了。

以下就是用我的第一个Nagios插件来说明编写方法和我遇到一些问题调试方法。如果你有耐心可以通篇看完,应该对第一次写的人来说会有很大帮助(如果你看不懂,可能是我写得不清楚 那就没办法了 表达能力有限)

需求:

监控普通磁盘的健康状况(普通磁盘以外还有RAID、阵列的监控是不同方法来做的,这里先不讨论,先从最简单的入手),定期进行检测,并进行报警,报警内容磁盘是否正常,不正常是什么状态。

分析编写过程:

我写脚本的前提都是先从手动成功完成,再到自动化(我想其它人的思路应该都一样的)

1、找到监控磁盘的方法
通过一番查找 smartctl 这个命令是比较不错的  centos slackware一般的默认都有这个
smartctl -H /dev/sda  只检测状态
smartctl -i /dev/sda   只检测硬盘信息
smartctl -a /dev/sda 检测所有信息

2、获取检测信息
# smartctl -H /dev/sda
smartctl version 5.38 [x86_64-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

SMART Health Status: OK

关键的最后一行说明磁盘的情况       截取  DISK_HEALTH=`smartctl -H /dev/sda | tail -1 | cut -d: -f2-  `

3、 进行关键判断
据我所知道的 smartctl 5.38  是出以上的結果 为OK
而 smartctl 5.39 是出以下結果
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
关键词是PASSED
所以要分析判断多种情况

4、脚本编写步骤

1)了解nagios插件编写规范

Nagios的插件可以用脚本(shell、Perl)C编译后的可执行程序,但必须满足以下两件事:

A、既出时有一个返回值
B、至少向标准输出设备(STDOUT)输出一行文件。(但也不能太大,默认是4K,如果想大些,修改源程序吧,方法搜。。。)

返回值定义:
Plugin Return Code
Service State
DISK State
0
OK
OK 或者PASSED
1
WARNING
插件警告  DISK报警只分OK或者CRITICAL
2
CRITICAL
DISK检测非OK 或者PASSED
3
UNKNOWN
未知状态

2)插件编写SHELL速成法

在这里我选用我最熟悉的SHELL进行脚本编写 ,

我的速成法就是,直接去nagios exchange 去下比较成熟的比较简单的shell脚本,这样会从一开始借鉴别人好的方法,养成好的习惯,而且只要你有一点SHELL编程经验也可以很快写得像一个老手。(不过不要把自己搞晕了就行)

3)以下是我的check_disk_health.sh

#!/bin/bash
# ========================================================================================
# disk health  plugin for Nagios
#
# Written by    : Ajian
# Release       : 1.2.0
# Creation date : 2009-07-28
# Revision date : 2009-07-30
# Description   : Nagios plugin (script) to check disk health .
#               This script has been designed and written on Linux System.
#
# USAGE         : ./check_disk_health.sh [-d (disk)]
#
# Exemple: ./check_cpu_stats.sh
#          ./check_cpu_stats.sh -d /dev/sda
#
#
# HISTORY :
#     Release   |     Date      |    Authors            |       Description
# --------------+---------------+----------------------+-----------------------------------
#  1.0.0        | 2009-07-28     | Ajian                | Create the script
#  1.2.0        | 2009-07-30    |  Ajian                | modify the script and run well ,fix a bug.
# -----------------------------------------------------------------------------------------
# NOTICE:
#-----------------------------------------------------------------------------------------
#     You should have the root Permissions ,You can use sudo to realize .
# -----------------------------------------------------------------------------------------                                   

# Nagios return codes
#定义 nagios返回的状态变量
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3      

# Paths to commands used in this script.  These may have to be modified to match your system setup.
# 定义关键的核心命令smartctl 路径 如果你的系统不是这个地址,请更改。 以下注释的是调试的信息,是自动获取命令路径的方法。
SMARTCTL="/usr/sbin/smartctl"
#SMARTCTL=`which smartctl`
#if [ $? -ne 0 ]; then
#        echo " smartctl is found in $SMARTCTL ; Go on ... "
#        echo "smartctl the command cannot find"
#        exit $STATE_UNKNOWN
#fi
# Plugin parameters value if not define
# 定义默认的检测硬盘
CHECK_DISK="/dev/sda"                  

# Plugin variable description
# 插件描述信息
PROGNAME=$(basename $0)
RELEASE="Revision 1.2.0"
AUTHOR="(c) 2009 Ajian (ajian521@gmail.com)"

# Functions plugin usage
# 插件的使用方法函数
print_release() {
    echo "$RELEASE $AUTHOR"
}                          

print_usage() {
        echo ""
        echo "$PROGNAME $RELEASE - Disk health check script for Nagios"
        echo ""
        echo "Usage: check_disk_health.sh -d /dev/sdb"
        echo ""
        echo "  -d  the disk (/dev/sda) "
        echo "          not the Hard disk partition(sda2 is wrong)"
        echo "  -v  check the version"
        echo "  -h  Show this page"
        echo ""
    echo "Usage: $PROGNAME"
    echo "Usage: $PROGNAME --help"
    echo ""
    exit 0
}                                                                                                          

print_help() {
        print_usage
        echo ""
        echo "This plugin will check disk health  "
        echo ""
        exit 0
}                                                  

# Parse parameters
# 传递参数
while [ $# -gt 0 ]; do
    case "$1" in
        -h | --help)
            print_help
            exit $STATE_OK
            ;;
        -v | --version)
                print_release
                exit $STATE_OK
                ;;
        -d | --disk)
                shift
                CHECK_DISK=$1
                #判断磁盘是否存在
                if [ ! -b $CHECK_DISK ];then
                        echo "$CHECK_DISK is no exsit,Please change it "
                        exit $STATE_CRITICAL
                fi
                ;;
        *)  echo "Unknown argument: $1"
            print_usage
            exit $STATE_UNKNOWN
            ;;
        esac
shift
done

#根据不同的操作进行不同的操作,这里暂时只支持Linux
case `uname` in
        Linux )
             #最核心的部分 前面都是些脚本的基本功能 一个框架 因为第一个脚本牵扯到了很多东西,虽然功能很简单,
             #但折腾了我不少,在后面的分析中会具体说到 总之注意sudo用法 脚本一开始就有说哦
                DISK_HEALTH=`$SMARTCTL  -H $CHECK_DISK | tail -1 | cut -d: -f2- `
                #DISK_HEALTH="OK"
        #       DISK_INFO=`/usr/bin/sudo $SMARTCTL -i $CHECK_DISK | grep "Device:"`
                if [ "$DISK_HEALTH" = " OK" ]|| [  "$DISK_HEALTH" = " PASSED" ];then
                        echo "OK - $CHECK_DISK status is $DISK_HEALTH "
                        #echo "OK - $CHECK_DISK status is $DISK_HEALTH | $DISK_INFO"
                        exit $STATE_OK
                else
                        echo "CRITICAL - $CHECK_DISK status is $DISK_HEALTH "
                        #echo "CRITICAL - $CHECK_DISK status is $DISK_HEALTH | $DISK_INFO"
                        exit $STATE_CRITICAL
        fi
            ;;

        *)              echo "UNKNOWN: `uname` not yet supported by this plugin. Coming soon !"
                        exit $STATE_UNKNOWN
            ;;
        esac

4)运行脚本

(注意:在最开始自己写的脚本是没有sudo的,以上脚本是已经调试过后的,还需要配置一些其它的东西,慢慢看吧)
给与脚本执行权限,手动执行

# ./check_disk_health.sh
OK - /dev/sda status is  OK

結果正确了,其实这个时候,高兴得太早了。 我先不说问题、继续正常的一般流程。

5、配置Nagios 调用插件

1)在远程NRPE 被监控服务器上修改nrpe.conf
# vim /usr/local/nagios/etc/nrpe.cfg
添加 command[check_sda_health]=/usr/local/nagios/libexec/check_disk_health.sh -d /dev/sda
(注意这里了,先提醒下,这里是错误的,一般是正确的,是这个脚本的特殊性造成的)

2)在Nagios 监控服务器上添加一些配置

定义服务

define service{
use                             Disk-Health
host_name                       DB-56
servicegroups                   Disk-Health
service_description            check sda disk health
contact_groups                  admins
check_command               check_nrpe!check_sda_health
}
如果像上面定义一个服务 那么就要注意相关的定义了 ,
定义Disk-Health 模版  把硬盘检测定义一个模版会比较好控制,因为硬盘的检测不像其它服务一样需要准确的及时性反正检测得太多可能会造成压力,一般一天检测几次就够了。
定义DB-56 主机需要定义
定义组 admins
以上这些只要安装过nagios 一般都知道的了 只是强调下模版的单独定义

3)通过WEB控制检测 查看結果

結果是失败 报警CRITCTL 但是状态里面的信息都是空的  CRITCTL - /dev/sda status is

6、调试

从Nagios的远程监控来看是失败的,并且没有获取到任务有用的信息。

分析可以看到,说明nrpe调用  这个变量获取到的是为空的信息
DISK_HEALTH=`$SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `
即是空的 只有一个原因,肯定是没有执行 如果执行了 肯定会有字段 不管这个字段是否相符。
但是手动执行是没有问题。
经过对smartctl的查看 原来这个命令是只允许root进行调用的。
现在需要解决的问题是:非root 用户 如何远程调用含有需要有root权限命令的脚本进行监控。
(不要小看这一句话,每一个词都是一个需要攻克的地方)
以下是调试步骤:
1)非root用户
NRPE插件是用nagios这个用户来执行的 所以要得到真实的情况需要
A: su nagios   再执行脚本 (这个方法比较好)
B: sudo -u nagios ./check_disk_health.sh
結果:

sudo -u nagios ./check_disk_health.sh
CRITICAL - /dev/sda status is
跟远程的結果是一样的了 没有信息
2)需要有root权限
需要root权限只有一个办法就是用sudo
将DISK_HEALTH=`$SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `
改为DISK_HEALTH=`/usr/bin/sudo $SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `
(最后发现这时加sudo 并不是关键 关键是很行脚本时用sudo )
結果:sudo -u nagios ./check_disk_health.sh
Password:
需要输入密码  sudo不用输入密码的方法
修改sudo配置文件
执行 visudo
添加
nagios ALL=(ALL) NOPASSWD:/usr/local/nagios/libexec/check_disk_health.sh
建议:最好进行sudo的一些控制,很多网方法就是nagios ALL=NOPASSWD:ALL
结果:
su nagios
/usr/bin/sudo check_disk_health.sh
OK - /dev/sda status is OK
那么在nrpe.conf配置文件中需要添加sudo
command[check_sda_health]=/usr/bin/sudo /usr/local/nagios/libexec/check_disk_health.sh
最开始那个是错误的 注意啊 这个是需要添加/usr/bin/sudo 就是说只要脚本中涉及到提升到root权限的命令那么就要用这个
3)远程调用
远程调用方法:./check_nrpe -H 192.168.0.56 -c check_sda_health
同上如果想模拟真实环境请切换到相应的执行用户 su nagios 再执行以上操作
结果:   NRPE: Unable to read output
这个错误的原因一定要明白,之所以报这个错意思是说NRPE没有获取到任何信息,也说是写脚本之前说的其中第二条规范
问题:在没有任何信息的情况下怎么来获取NRPE执行的日志呢
就是要确定问题在哪,经过一大番的查找眼睛偶尔看到一个有趣的小方法
修复nrpe.conf配置文件 在要检查的命令后面添加>>/tmp/output 2>&1 将错误导出到文件中进行查看
command[check_sda_health]=/usr/bin/sudo /usr/local/nagios/libexec/check_disk_health.sh -d /dev/sda >>/tmp/output 2>&1
重记nrpe服务
远程调用 结果当然还是NRPE: Unable to read output
查看/tmp/output
sudo: sorry, you must have a tty to run sudo
有错误就简单了  原来这个是默认不允许sudo 在后端进行
visudo
注释Defaults requiretty 就OK了
结果通过WEB查看也正确了。
(注意:注释后 检测仍然会是Unable 不过看/tmp/output就会有正确的結果,所以有正确的結果后,一定要去掉 >>/tmp/outpt 2>&1 信息都导到文件中了 nagios还是得不到任何消息。)

一个脚本执行成功后,就是大批量应用,用生产环境验证,出现问题继续调试。

以上为所有的分析调试方法。如果你看到最后一步了,说明你很有耐心,你也一定会成功的,至于写得好与坏、对与错请尽管说,这不会影响你的成功。呵呵。

JIRA升级小记方法一则

作者:Ajian 发布时间:July 28, 2009 分类:管理监控维护,Linux软件

前言:  上次刚安装完JIRA 13.4没两天 JIRA又升级到13.5了,都想用最新的,而且同事说汉化得不好,想看看新的版本,正好之前的JIRA还没有怎么用,那就开始折腾他。升级吧。

升级要求:

虽然数据不多,但尽量保存数据,再花那么久时间去创建用户项目也是个麻烦的事。(不过我是抱着折腾的想法去做的,因为没有太重要的数据,数据不丢失当然是最好,結果当然是一切顺利,数据完好)

升级软件:

atlassian-jira-enterprise-3.13.4-standalone升级到atlassian-jira-enterprise-3.13.5-standalone

升级步骤:

注意:要继续下面的请先参考我的之前的JIRA安装“Linux JIRA+MYSQL安装与调试方法

第一步:下载3.13.5

到官网下载就行了,之前那篇文章有。

其实在下载的页面可以看到 install guide 和upgrade guide 完全可以参考上面的,也是比较詳細了,不过我看了一眼就觉得太麻烦了,其实可以简化很多的。

http://www.atlassian.com/software/jira/docs/latest/upgrading.html

第二步:解压并同步一些文件

安装文章里有这个配置 ln -s atlassian-jira-enterprise-3.13.4-standalone jira

这个方法其实很方便尤其在更新的时候

tar zxvf atlassian-jira-enterprise-3.13.5-standalone.tar.gzrm jiraln -s atlassian-jira-enterprise-3.13.5-standalone jira

同步MYSQL/JDBC驱动

cpatlassian-jira-enterprise-3.13.4/common/lib/mysql-connector-java-5.0.8-bin.jar  atlassian-jira-enterprise-3.13.5/common/lib/

同步 WEB相关的文件 如附件等

cp -r atlassian-jira-enterprise-3.13.4-standalone/website/*  jira/website/

website下面的如果不同步,会出现一些内容丢失、是在系统日志中查看到的,会找不到东西。

第三步:再一次修改JIRA配置

这个是跟原来安装文档中一样的修改两个配置文件。

第四步:安全保险,备份JIRA数据库

这样WEB程序和数据库都不少,如果出错还有后退的余地。

第五步:删除原来的jira进程,重启startup.sh

起来后使用tail -f jira/logs/catalina.out  查看错误,如还有其它问题首先检查上面的是否都注意做了,有新的问题google.

如果按之前我的那篇文章安装的,又用这篇文章进行的升级,应该是没有问题了,我的一气哈成,都是看日志进行的调试。

JIRA操作小记录:

1、所有的配置在管理里都是可以修改的 ,如组的权限 报告问题的类型英文改中文或者添加等等(所以之前同事说的大部分英文问题都可以解决了)

2、登陆名最好用英文 如果是中文创建和使用都没有问题 就是在删除的时候会报ava.lang.UnsupportedOperationException: Could not remove user: ??? to group: jira-developers

显然是对中文支持的不好,暂时没有解决。我看还是用英文吧。

3、建立好了用户不要经常删除重建,会有很多关联的东西,可能会比较麻烦哦。

暂时这些(END)

服务器监控系统图

作者:Ajian 发布时间:July 23, 2009 分类:管理监控维护

这是一个服务器系统监控图,目的是提前发现服务器中的问题。现在这套系统还差日志服务器这块,因为缺少日志服务器,所以还没有完成,不过整个已经大致实验过没有什么问题。
可能以后还会有改动,但不会改动很大。很多还是细节问题。如果都完成了,应该会有相关的文档出了。最近写的几个文档 还有一个“Varnish Cache 计划V1.0” 也都没有完成,唉,写不动了?加油哦。

[caption id="attachment_625" align="aligncenter" width="746" caption="服务器监控系统图"]服务器监控系统图 [/caption]

Compiz Fusion 安装在 KDE 4.3(Factory)/ OpenSuse 11.1

作者:Ajian 发布时间:July 23, 2009 分类:openSUSE

前言:之前一直都没有在openSUSE11.1使用Compiz正常过,之前都是用的KWIN来实现的3D效果,但效果实在太慢了,所以后来就一直没有用3D效果。最近头脑一热还是想把他用上,就试了试。
参考
Compiz Fusion - openSUSE
经验一:Compiz比Kwin速度快,效果也更好些
经验二:如果是默认的openSUSE11.1的KDE可以使用一键安装,而factory则不行
以下的安装环境是KDE4.3 (我的是KDE 4.2.96 (KDE 4.3 RC2))openSUSE11.1 使用的源是Factory
使用以下的两个源


Index of /repositories/KDE:/KDE4:/Factory:/Desktop/openSUSE_11.1
Index of /repositories/X11:/XGL/openSUSE_11.1_KDE4_Factory


代替以下的源
Index of /repositories/X11:/XGL/openSUSE_11.1

替换后进行一系列的更新

接下来进行一些配置

如果现在的桌面是compiz的 并且标题栏是没有的

1、首先设置为KWIN

Personal Settings>Defaul Applications>Window Manager

进入个人设置 选择“默认程序” > 选择“窗口管理” 把他置为kwin

2、再打开CompizConfig Settings Manager (CCSM) ,在搜索中输入command搜索出来 第一个命令里面输入(emerald --replace)另外如果有simple compiz setting manger  最好使用default特效 一定不要选择最少的特效,其实这个是跟要启用的相关程序有关,至少特效中以下几项要勾选

windows decoration

3、接下来添加emerald --replace到/etc/rc.d/boot.local最下面保证重启时起来,如果在不重启时使用 在命令行下输入该命令

4、设置回Compiz

Personal Settings>Default Applications>Window Manager

个人设置> 默认程序>窗口管理 选择 Choose compiz (not compiz custom).
应该就差不多了,其实这一系列的操作目的都是为了用emerald来替换出现问题的标题栏。