Tag: 经验



29 七 09

前言: 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还是得不到任何消息。)

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

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







11 五 09

前言:最近我的系统越来越肥了,从原来刚安装的4个G到现在的13个G,都番了三倍了。再“肥”下去,我的要根目录磁盘空间都装不下了。决定一定要给他“减肥”。google上一搜系、这类文章太少了,Ubuntu的到是不少。还是自己来吧。以下的步骤和大部分方法适合所有的linux系统垃圾清理.

一、查看哪些目录占用的空间最大

cd /
du -sh *

以下是我的系统减肥前的大小情况(不包括挂载的)

8.4M    bin
14M     boot
220K    dev
59M     etc
4.0K    home
90M     lib
16K     lost+found
40K     media
4.0K    mnt
398M    opt
0       proc
2.0G    root
12M     sbin
21M     srv
0       sys
399M    tmp

5.0G    usr
4.8G      var
从上面可以看到 root opt tmp usr var这几个目录是占用最大的 ,挨个分析

root 目录是我的根目录(我习惯直接用root用户),会有大量的自己的文件在这里面,如下载直接在某个目录,另外就是大量程序的缓存文件。

opt 是一些程序的暂时没有找到减的方法

tmp 不用说就是临时文件的存放地,这么大肯定是可以减的,至于有人说是否直接删除,肯定也是不好的,有些正在使用的东西也在里面。

usr 安装程序的地方 大量占用的都是lib 和share ,其实难点就在这里怎么删除孤立的函数库文件和旧的已安装的程序。这里請求大家的方法,我没有找到好的方法有文章说用清理命令:urpme –auto-orphans (http://www.linuxsir.org/bbs/showthread.php?p=1981847#post1981847),我查过基本没有这个软件 不知道是否真有。

var  这里主要是zypp的下载的安装包、还有日志文件

所以我接下来要清理的主要是1、临时文件 2、缓存文件 3、日志文件 4、zypp下载的安装包

二、具体清理过程


1、手动清除临时文件

如果是手动清楚的话最好是根据时间来清除,最基本用到一个命令tmpwatch

默认没有安装   各种发行版本下载地:http://rpm.pbone.net/index.php3/stat/3/srodzaj/1/search/tmpwatch

安装文件 ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/elvigia/openSUSE_11.1/i586/tmpwatch-2.9.13-5.2.i586.rpm

命令 : tmpwatch –mtime –all 168 /tmp

168=7*24

临时文件的目录有/tmp /var/tmp

另外注意:如果你安装了tmpwatch 那么在/etc/cron.daily下自动安装了tmpwatch的自动清理临时文件的脚本

ajian:/etc/cron.daily # cat tmpwatch
#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
        /usr/sbin/tmpwatch "$flags" -f 30d "$d"
    fi
done

默认是保留一个月内的
你也可以更改时间更长或者更短

2、清理日志文件

日志文件并非都是无用的,一般都是用logrotate 来压缩分割日志,

ajian:/etc/cron.daily # cat logrotate
#!/bin/sh
 
# exit immediately if there is another instance running
if checkproc /usr/sbin/logrotate; then
        /bin/logger -t logrotate "ALERT another instance of logrotate is running - exiting"
        exit 1;
fi;
 
TMPF=`mktemp /tmp/logrotate.XXXXXXXXXX`
 
/usr/sbin/logrotate /etc/logrotate.conf 2>&1 | tee $TMPF
EXITVALUE=${PIPESTATUS[0]}
 
if [ $EXITVALUE != 0 ]; then
    # wait a sec, we might just have restarted syslog
    sleep 1
    # tell what went wrong
    /bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
    /bin/logger -t logrotate -f $TMPF
fi
 
rm -f $TMPF
exit 0

这个一般默认是有的,如果想改动的话 只要更改这个脚本来进行你的定制。
但还是会生成一些压缩包,如果这些旧的日志不需要的话就完全都可以手动删除。
目录为/var/log

另外还可以自制脚本进行清理

#!/bin/bash
# Clean the log directory
#date:20090510
#create by Ajian
#http://www.OhLinux.com
LOGDIR=/var/log
 
cd $LOGDIR
tar -cz *  /root/cleanlog-`date +%B`.tar.gz
 
# Clean files
for i in $LOGDIR/*; do
         if [ -f $i ]; then
              echo "" > $i 2>;/dev/null
          fi
done
 
# Clean files in directories
for i in $LOGDIR/*; do
          if [ -d $i ]; then
               cd $i
           if [ $? != 0 ]; then
                exit 1
           fi
    for f in *; do
       echo "" > $f 2 >/dev/null
        done
   fi
done
exit 0

3、清理缓存文件 使用工具

缓存文件有很多,系统的 程序的 在不同的目录下不同的缓存方式,如果你一个个去尝试找的话也都可以完成,不过那样太费事了

这里使用一个工具,也可以实现前面两种情况的清理工作

bleachbit
http://bleachbit.sourceforge.net/download.php

这个软件可以满足大部分的Linux发行版本、安装相应的版本软件后打开 界面相当的简单 第一次打开还会提示配置,有中文的选项不过选择了好像没有用

bleachbit

左侧是各种清除的项目 右侧为显示栏

如果你对他不够信任,完全可以选择后preview下看下是否没有删除重要的内容 这个工具可以清理缓存、临时、日志文件包括系统和他所包含应用程序的。

这个工具算是比较方便了,我实验了好几个、还是比较的安全。

4、清理zypp下载保存的包

这点没有想到包管理工具下载保存的包达到了5G、而且很傻的是原来撤掉的repo不会删除、增长更新的软件版本不会清除以前较旧的,所有的都保留了,这里做得不是很好。

所以我自己写了个脚本、实现了清理已经删除的repo 产生保存的文件、保留规定时间内下载的软件包 (其实我原想实现的是保存同软件最近的一两个版本,删除较旧的版本软件)
如果想调试该脚本 请把注释掉的echo 打开 关闭删除命令

#!/bin/bash
# Clean the zypp packages
#date:20090510
#create by:Ajian
#http://www.OhLinux.com
 
CACHEDIR=/var/cache/zypp/packages
REPODIR=/etc/zypp/repos.d
#the unit is the day
TIME=7
# Clean old files in directories
tmpwatch --mtime --all  $[$TIME*24] $CACHEDIR
#Clean unused directories
for i in $CACHEDIR/*; do
  if [ -d "$i" ]; then
    DIRNAME=`echo "$i" |awk -F\/ '{ print $NF }'| sed -e 's/\_/\:/g'`.repo
 
    if [ ! -f "$REPODIR"/"$DIRNAME" ] ; then
#Debug
#      echo "$i   --->   $DIRNAME  is not exist!"
#Do the delet option
       rm -rf $i
    fi
fi
  done
exit 0

使用脚本跑完后/var/cache/zypp/packages由原来的5.3G减到381M

另外如果你的网速够快 或者有自信不用在本地保存安装包在本地完成可以去掉这个功能
cd /etc/zypp/repos.d
编辑文件装keeppackages改成0 就不会保存了

[KDE_42]
 
name=KDE 4.2.x Packages (openSUSE_11.1)
 
enabled=1
 
autorefresh=1
 
baseurl=http://download.opensuse.org/repositories/KDE:/42/openSUSE_11.1/
 
type=rpm-md
 
gpgcheck=1
 
gpgkey=http://download.opensuse.org/repositories/KDE:/42/openSUSE_11.1/repodata/repomd.xml.key
 
keeppackages=1

三、系统减肥結果

系统减肥之前

e5a4a7e5b08f

系统减肥之后

e5a4a7e5b08f2

root 目录有1G多的文件是自己的文档文件

所以系统现在占用不到7G 比原来减少了一半,但比起刚装完的系统 还是有点肥 , 最后的难点还是在删除孤立的包和旧的程序上面,这点如果谁有好的点子可以分享下,谢谢。







23 三 09

前言:其实利用SVN实时同步到WEB服务器即时展现出来的文章已经到处都是,但是我在做的时候 还是有不少的小问题,很多文章也没有提出来过,还有同步也是,我还是记录下自己做过的尤其是一些细节,时间一长又会忘掉了。

同步程序思路:用户提交程序到SVN,SVN触发hooks,按不同的hooks进行处理,这里用到的是post-commit,利用post-commit到代码检出到SVN服务器的本地硬盘目录,再通过rsync同步到远程的WEB服务器上。

知识点:
1、SVN的hooks
# start-commit 提交前触发事务
# pre-commit 提交完成前触发事务
# post-commit 提交完成时触发事务
# pre-revprop-change 版本属性修改前触发事务
# post-revprop-change 版本属性修改后触发事务
通过上面这些名称编写的脚本就就可以实现多种功能了,相当强大。
2、同步命令rsync的具体参数使用
3、具有基个语言的编程能力bash python perl都可以实现

post-commit具体实现细节
post-commit脚本

#!/bin/sh
# -------------------------------------------------------------------------------
# Filename:    post-commit
# Revision:    1.0
# Date:        2009/03/20
# Author:      Ajian
# Email:       ajian521#gmail.com
# Website:     www.ohlinux.com
# Description: WEB server with synchronization code by SVN
# -------------------------------------------------------------------------------
# Copyright:   2009 (c) Ajian
# License:     GPL
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# -------------------------------------------------------------------------------
#Version 1.0
#When users submit finished code, put the code up-to-date detection and synchronization to the WEB server, taking care not to include the delete operation.
 
#Set variable
SVN=/usr/bin/svn
WEB=/home/test_nokia/
RSYNC=/usr/bin/rsync
LOG=/tmp/rsync_test_nokia.log
WEBIP="192.168.0.23"
export LANG=en_US.UTF-8
 
#update the code from the SVN
$SVN update $WEB --username user --password  password
#If the previous command completed successfully, to continue the following
if [ $? == 0 ]
then
    echo ""     >> $LOG
    echo `date` >> $LOG
    echo "##############################" >> $LOG
    chown -R nobody:nobody /home/test_nokia/
    #Synchronization code from the SVN server to the WEB server, notes:by the key 
    $RSYNC -vaztpH  --timeout=90   --exclude-from=/home/svn/exclude.list $WEB root@$WEBIP:/www/ >> $LOG
fi

以上是具体的post-commit程序
注意事项:
1、一定要定义变量,主要是用过的命令的路径。因为SVN的考虑的安全问题,没有调用系统变量,如果手动执行是没有问题,但SVN自动执行就会无法执行了。
2、SVN update 之前一定要先手动checkout一份出来,还有这里一定要添加用户和密码 如果只是手动一样会更新,但自动一样的不行。
3、加上了对前一个命令的判断,如果update的时候出了问题,程序没有退出的话还会继续同步代码到WEB服务器上,这样会造成代码有问题
4、记得要设置所属用户,因为rsync可以同步文件属性,而且我们的WEB服务器一般都不是root用户,用户不正确会造成WEB程序无法正常工作。
5、建议最好记录日志,出错的时候可以很快的排错
6、最后最关键的数据同步,rsync的相关参数一定要清楚,这个就不说了。注意几个场景:
这里的环境是SVN服务器与WEB服务器是开的
把SVN服务器定义为源服务器 WEB服务器为目的服务器
场景一、如果目的WEB服务器为综合的混杂的,像只有一个WEB静态资源,用户提交的,自动生成的都在WEB的一个目录下,建议不要用–delete这个参数
上面这个程序就是这样,实现的是源服务器到目的服务器的更新和添加,而没有删除操作,WEB服务器的内容会多于源SVN的服务器的
场景二、实现镜像,即目的WEB服务器与源SVN服务器一样的数据,SVN上任何变化WEB上一样的变化,就需要–delete参数
场景三、不需要同步某些子目录,可能有些目录是缓存的临时垃圾目录,或者是专用的图片目录(而不是样式或者排版的)要用exclude这个参数
注意:这个参数的使用不用写绝对路径,只要目录名称就行 aa代表文件 aa/ 代表目录 ,缺点就是如果有多个子目录都是一样的名称 那么这些名称就都不会被同步
建议用–exclude-from=/home/svn/exclude.list 用文件的形式可以方便的添加和删除
exclude.list

.svn/
.DS_Store
images/

利用SVN的钩子还可以写出很多的程序来控制SVN 如代码提交前查看是否有写日志,是否有tab,有将换成空格,是否有不允许上传的文件,是否有超过限制大小的文件等等。







18 三 09

呵呵,最近我就升级得比较频繁,出了不少的问题。

我把KDE4.1升到KDE4.2.1 后来又升到4.3 功能上感觉有不少的改进,但毕竟还是有不少的BUG,甚至是最致命的。后来在网上查都解决不了,就问了下swyear(http://swyear.blogspot.com/2009/03/kde-42.html)要注意哪些事项 看下下面的对话吧,懒得再重复一遍了。

jian 提到…
你好,我最近也升级到了KDE4.2 升级方法见http://www.ohlinux.com/?p=251 应该是官方的方法 后来我又升级到4.3但发现很不稳定有很多的问题 所以我又降下来了 现在用的是4.2.66 (KDE 4.2.66 (KDE 4.3 >= 20090310)) “release 2.4″ 现在的问题是 plasma-desktop 占用的CPU到100% 占用了我双核中的其中一个CPU 造成发热量很大,而且时常也有完全卡机(没有任何挽救的办法)的情况 不知道你是否有遇到过 我现在一直在更新baseurl=http://download.opensuse.org/repositories/KDE:/KDE4: /UNSTABLE:/Desktop/openSUSE_11.1/ 但一直都没有解决 请求帮助 谢谢

jian 提到…
另外我要补充的是 我的libqt4 用的是4.5.0 我看了你提到的swyear中的是4.4.3 这个是否会有影响?主要我现在查找不出这个100%的原因 你是否有比较好的方法

swyear 提到…
jian:
除非必要,我不會去用 UNSTABLE 的東西,除非要測試,目前我沒有多餘的機器,要用 VM 跑也沒多餘空間(真慘),所以幫不上忙了。看您的 KDE 版本編號是屬於 4.3 系列的,您可以將 UNSTABLE 的套件庫停用,用 Factory 的 4.2.1 來無條件降級回來,這樣會比較穩定。KDE 4.3 許多新特性『聽說』要用 qt4.5,若是 4.2.1 用 qt4.4 系列的就可以了。

jian 提到…
我昨天晚上用factory降了,但是现在桌面用不了了,调不出桌面配置,有什么方法可以恢复默认opensuse的桌面?

jian 提到…
已经解决了 我把/root/.kde4/share/apps下的desktoptheme移除就可以了 还有出现firefox不能使用的情况,也是因为有相关的程序没有降级造成的。100%的问题也没有了,现在还有一个问题就是任务管理器上不能显示中文 中文是空白的

当然还有遇到不少小的问题,如声音没有了,是因为他保存了上次的声音是关闭的,如果在开机进入桌面的时候不迅速的把音量打开,会一直都没有声音。现在还有几个问题是我的kmail不能存储密码,任务管理器上的标题不显示中文,还有一个akonadi检测服务,还老是出错,不知道做什么的,想把他给删除了;ATI的驱动好像没有最新内核版本的,我就一直升不了内核。等等问题