Archive for 2011年8月25日


Linux常用的系统监控shell脚本

1、查看主机网卡流量

#!/bin/bash

#network

#Mike.Xu

while : ; do

time=’date +%m”-”%d” “%k”:”%M’

day=’date +%m”-”%d’

rx_before=’ifconfig eth0|sed -n “8″p|awk ‘{print $2}’|cut -c7-’

tx_before=’ifconfig eth0|sed -n “8″p|awk ‘{print $6}’|cut -c7-’

sleep 2

rx_after=’ifconfig eth0|sed -n “8″p|awk ‘{print $2}’|cut -c7-’

tx_after=’ifconfig eth0|sed -n “8″p|awk ‘{print $6}’|cut -c7-’

rx_result=$[(rx_after-rx_before)/256]

tx_result=$[(tx_after-tx_before)/256]

echo “$time Now_In_Speed: “$rx_result”kbps Now_OUt_Speed: “$tx_result”kbps”

sleep 2

done

2、系统状况监控

#!/bin/sh

#systemstat.sh

#Mike.Xu

IP=192.168.1.227

top -n 2| grep “Cpu” >>./temp/cpu.txt

free -m | grep “Mem” >> ./temp/mem.txt

df -k | grep “sda1″ >> ./temp/drive_sda1.txt

#df -k | grep sda2 >> ./temp/drive_sda2.txt

df -k | grep “/mnt/storage_0″ >> ./temp/mnt_storage_0.txt

df -k | grep “/mnt/storage_pic” >> ./temp/mnt_storage_pic.txt

time=`date +%m”.”%d” “%k”:”%M`

connect=`netstat -na | grep “219.238.148.30:80″ | wc -l`

echo “$time $connect” >> ./temp/connect_count.txt

3、监控主机的磁盘空间,当使用空间超过90%就通过发mail来发警告

#!/bin/bash

#monitor available disk space

SPACE=’df | sed -n ‘/ / $ / p’ | gawk ‘{print $5}’ | sed ’s/%//’

if [ $SPACE -ge 90 ]

then

fty89@163.com

fi

4、 监控CPU和内存的使用情况

#!/bin/bash

#script to capture system statistics

OUTFILE=/home/xu/capstats.csv

DATE=’date +%m/%d/%Y’

TIME=’date +%k:%m:%s’

TIMEOUT=’uptime’

VMOUT=’vmstat 1 2′

USERS=’echo $TIMEOUT | gawk ‘{print $4}’ ‘

LOAD=’echo $TIMEOUT | gawk ‘{print $9}’ | sed “s/,//’ ‘

FREE=’echo $VMOUT | sed -n ‘/[0-9]/p’ | sed -n ‘2p’ | gawk ‘{print $4} ‘ ‘

IDLE=’echo $VMOUT | sed -n ‘/[0-9]/p’ | sed -n ‘2p’ |gawk ‘{print $15}’ ‘

echo “$DATE,$TIME,$USERS,$LOAD,$FREE,$IDLE” >> $OUTFILE

5、全方位监控主机

#!/bin/bash

# check_xu.sh

# 0 * * * * /home/check_xu.sh

DAT=”`date +%Y%m%d`”

HOUR=”`date +%H`”

DIR=”/home/oslog/host_${DAT}/${HOUR}”

DELAY=60

COUNT=60

# whether the responsible directory exist

if ! test -d ${DIR}

then

/bin/mkdir -p ${DIR}

fi

# general check

export TERM=linux

/usr/bin/top -b -d ${DELAY} -n ${COUNT} > ${DIR}/top_${DAT}.log 2>&1 &

# cpu check

/usr/bin/sar -u ${DELAY} ${COUNT} > ${DIR}/cpu_${DAT}.log 2>&1 &

#/usr/bin/mpstat -P 0 ${DELAY} ${COUNT} > ${DIR}/cpu_0_${DAT}.log 2>&1 &

#/usr/bin/mpstat -P 1 ${DELAY} ${COUNT} > ${DIR}/cpu_1_${DAT}.log 2>&1 &

# memory check

/usr/bin/vmstat ${DELAY} ${COUNT} > ${DIR}/vmstat_${DAT}.log 2>&1 &

# I/O check

/usr/bin/iostat ${DELAY} ${COUNT} > ${DIR}/iostat_${DAT}.log 2>&1 &

# network check

/usr/bin/sar -n DEV ${DELAY} ${COUNT} > ${DIR}/net_${DAT}.log 2>&1 &

#/usr/bin/sar -n EDEV ${DELAY} ${COUNT} > ${DIR}/net_edev_${DAT}.log 2>&1 &

放在crontab里每小时自动执行:

0 * * * * /home/check_xu.sh

这样会在/home/oslog/host_yyyymmdd/hh目录下生成各小时cpu、内存、网络,IO的统计数据。

如果某个时间段产生问题了,就可以去看对应的日志信息,看看当时的主机性能如何。

1.删除0字节文件
find -type f -size 0 -exec rm -rf {} ;

2.查看进程
按内存从大到小排列
ps -e -o “%C : %p : %z : %a”|sort -k5 -nr

3.按cpu利用率从大到小排列
ps -e -o “%C : %p : %z : %a”|sort -nr

4.打印说cache里的URL
grep -r -a jpg /data/cache/* | strings | grep “http:” | awk -F’http:’ ‘{print “http:”$2;}’

5.查看http的并发请求数及其TCP连接状态:
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

6.
sed -i ‘/Root/s/no/yes/’ /etc/ssh/sshd_config sed在这个文里Root的一行,匹配Root一行,将no替换成yes.

7.1.如何杀掉mysql进程:
ps aux|grep mysql|grep -v grep|awk ‘{print $2}’|xargs kill -9

(从中了解到awk的用途)
pgrep mysql |xargs kill -9

killall -TERM mysqld

kill -9 `cat /usr/local/apache2/logs/httpd.pid`

试试查杀进程PID

8.显示运行3级别开启的服务:
ls /etc/rc3.d/S* |cut -c 15-

(从中了解到cut的用途,截取数据)

9.如何在编写SHELL显示多个信息,用EOF
cat < /root/pkts

39.然后检查IP的重复数 并从小到大排序 注意 “-t +0″ 中间是两个空格
# less pkts | awk {‘printf $3″n”‘} | cut -d. -f 1-4 | sort | uniq -c | awk {‘printf $1″ “$2″n”‘} | sort -n -t +0

40.查看有多少个活动的php-cgi进程
netstat -anp | grep php-cgi | grep ^tcp | wc -l

41.利用iptables对应简单攻击
netstat -an | grep -v LISTEN | awk ‘{print $5}’ |grep -v 127.0.0.1|grep -v 本机ip|sed “s/::ffff://g”|awk ‘BEGIN { FS=”:” } { Num[$1]++ } END { for(i in Num) if(Num>8) { print i} }’ |grep ‘[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}’| xargs -i[] iptables -I INPUT -s [] -j DROP

Num>8部分设定值为阀值,这条句子会自动将netstat -an 中查到的来自同一IP的超过一定量的连接的列入禁止范围。 基中本机ip改成你的服务器的ip地址

42. 怎样知道某个进程在哪个CPU上运行?
# ps -eo pid,args,psr

43. 查看硬件制造商
dmidecode -s system-product-name

44.perl如何编译成字节码,这样在处理复杂项目的时候会更快一点?
perlcc -B -o webseek webseek.pl

45. 统计var目录下文件以M为大小,以列表形式列出来。
find /var -type f | xargs ls -s | sort -rn | awk ‘{size=$1/1024; printf(“%dMb %sn”, size,$2);}’ | head
查找var目录下文件大于100M的文件,并统计文件的个数
find /var -size +100M -type f | tee file_list | wc -l

46. sed 查找并替换内容
sed -i “s/varnish/LTCache/g” `grep “Via” -rl /usr/local/src/varnish-2.0.4`

sed -i “s/X-Varnish/X-LTCache/g” `grep “X-Varnish” -rl /usr/local/src/varnish-2.0.4`

47. 查看服务器制造商
dmidecode -s system-product-name

48. wget 模拟user-agent抓取网页
wget -m -e robots=off -U “Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6″ http://www.example.com/

50. 统计目录下文件的大小(按M打印显示)
du $1 –max-depth=1 | sort -n|awk ‘{printf “%7.2fM —-> %sn”,$1/1024,$2}’|sed ’s:/.*/([^/]{1,})$:1:g’

51.关于CND实施几个相关的统计
统计一个目录中的目录个数
ls -l | awk ‘/^d/’ | wc -l

统计一个目录中的文件个数
ls -l | awk ‘/^-/’ | wc -l

统计一个目录中的全部文件数
find ./ -type f -print | wc -l

统计一个目录中的全部子目录数
find ./ -type d -print | wc -l

统计某类文件的大小:
find ./ -name “*.jpg” -exec wc -c {} ;|awk ‘{print $1}’|awk ‘{a+=$1}END{print a}’

53. 查找占用磁盘IO最多的进程
wget -c http://linux.web.psi.ch/dist/scientific/5/gfa/all/dstat-0.6.7-1.rf.noarch.rpm
dstat -M topio -d -M topbio

54. 去掉第一列(如行号代码)
awk ‘{for(i=2;i<=NF;i++) if(i!=NF){printf $i” “}else{print $i} }’ list

55.输出256中色彩
for
i in {0..255}; do echo -e “e[38;05;${i}m${i}”; done | column -c 80 -s ‘
‘; echo -e “e[m”

56.查看机器支持内存
机器插内存情况:
dmidecode |grep -P “Maximums+Capacity”

机器最大支持内存:
dmidecode |grep -P “Maximums+Capacity”

57.查看PHP-CGI占用的内存总数:
total=0; for i in `ps -C php-cgi -o rss=`; do total=$(($total+$i)); done; echo “PHP-CGI Memory usage: $total kb”

1.check_user.sh

#!/bin/bash

echo “You are logged in as `whoami`";

if [ `whoami` != linuxtone ]; then
echo “Must be logged on as linuxtone to run this script."
exit
fi

echo “Running script at `date`"

2.do_continue.sh

#!/bin/bash

doContinue=n
echo “Do you really want to continue? (y/n)"
read doContinue

if [ “$doContinue" != y ]; then
echo “Quitting…"
exit
fi

echo “OK… we will continue."

3.hide_input.sh

#!/bin/bash

stty -echo
echo -n “Enter the database system password: "
read pw
stty echo

echo “$pw was entered"

4.is_a_directory.sh

#!/bin/bash

if [ -z “$1″ ]; then

echo “"
echo " ERROR : Invalid number of arguments"
echo " Usage : $0 "
echo “"
exit
fi

if [ -d $1 ]; then
echo “$1 is a directory."
else
echo “$1 is NOT a directory."
fi

5.is_readable.sh

#!/bin/bash

if [ -z “$1″ ]; then

echo “"
echo " ERROR : Invalid number of arguments"
echo " Usage : $0 "
echo “"
exit
fi

if [ ! -r $1 ]; then
echo “$1 is NOT readable."
else
echo “$1 is readable."
fi

6.print_args.sh

#!/bin/bash
#
# The shift command removes the argument nearest
# the command name and replaces it with the next one
#

while [ $# -ne 0 ]
do
echo $1
shift
done

1. 找出那些被规则禁掉的IP,嗅探器

这段代码会在当前目录下面生成黑名单,根据nginx的access日志,统计被禁掉的403访问,它们不是搜索引擎的爬虫 ,也不是本机地址。

安全提示: 这个脚本对所有IP地址都是全面封杀无误的,所以你自己在使用这个脚本之前,千万要记住,不要为了测试你的规则,而直接用你的电脑,去测试 。因为万一触发了规则,就可能会被下面的脚本所查出来,包含在内。这种状况是可以避免的。
1. 通过openvpn代理上网,如果openvpn和服务器是同一台,那么ip地址就是127.0.0.1,这个IP己经被安全的排除在外了。另外注意,如果你用了chnroute,那么就要看你的VPS是在美国还是在国内,如果在美国,则无需担心,如果在国内,那么chnroute会把路由判断为还是用原来国内的IP,还是会触发规则。建议如果你的VPS在国内,就不要用chnroute。你自己 对网站进行侵入测试,必须挂openvpn来弄。
2. 可以在下面的脚本里面增加一条 grep -v “xx.xx.xx.xx” ,把你的IP排除在外,这个时候就有一点小繁琐,因为如果你跟我一样是用adsl上网,就会需要手动查看自己的IP,每次手动查看IP也挺麻烦的,所以还是建议用第一条方案。
安全脚本文件,用于生成blacklist. 文件名: genblacklist.sh

#!/bin/sh
cat /var/log/nginx/access_log | grep " 403 " | grep -v google | grep -v sogou | grep -v baidu | grep -v “127.0.0.1″ | grep -v “soso.com" | awk ‘{ print $1 }’ | uniq | awk -F":" ‘{print $4}’ | sort | uniq > blacklist.txt

2. 根据提供的blacklist禁止IP,解禁IP
禁止IP脚本blockip.sh

#!/bin/sh
echo “Block following ip:"
result=""
while read LINE
do
/sbin/iptables -A FORWARD -s $LINE -j DROP
if [ $? = “0″ ];then
result=$result$LINE","
fi
done < /vhosts/blacklist.txt
echo $result"Done";

解禁IP脚本releaseip.sh

#!/bin/sh
echo "Release following ip:"
result=""
while read LINE
do
/sbin/iptables -D FORWARD -s $LINE -j DROP
if [ $? = "0" ];then
result=$result$LINE","
fi
done < /vhosts/blacklist.txt
echo $result"Done";

3. 封杀嗅探器

location ~* .(mdb|asp|rar) {
deny all;
}
if ($http_user_agent ~ ^Mozilla/4.0$ ) {
return 403;
}

4. 利用Cron自动屏蔽非法IP
crontab -e编辑cron任务表。
增加一条*/30 * * * * /vhosts/reblock.sh
/vhosts/reblock.sh是自动执行封锁的命令。

#!/bin/sh
cd /vhosts
/bin/sh /vhosts/releaseip.sh
/bin/sh /vhosts/genblacklist.sh
/bin/sh /vhosts/blockip.sh
echo "total ip in black list:"
/bin/cat /vhosts/blacklist.txt | /usr/bin/wc -l

在对某个目录进行压缩的时候,有时候想排除掉某个目录,例如:

如果123目录下有3个子目录,aa、bb、cc。

我现在想只对aa和bb目录打包压缩,命令如下:

tar -zcvf 123.tar.gz –exclude=cc 123

(在123目录的外面运行)

使用exclude参数来过滤不需要的目录或文件,排除某个文件的操作和目录一样。

#!/bin/sh
# The right of usage, distribution and modification is here by granted by the author.
# The author deny any responsibilities and liabilities related to the code.
#
OK=0
A=`find $1 -print`
if expr $3 == 1 >;/dev/null ; then M=Jan ; OK=1 ; fi
if expr $3 == 2 >;/dev/null ; then M=Feb ; OK=1 ; fi
if expr $3 == 3 >;/dev/null ; then M=Mar ; OK=1 ; fi
if expr $3 == 4 >;/dev/null ; then M=Apr ; OK=1 ; fi
if expr $3 == 5 >;/dev/null ; then M=May ; OK=1 ; fi
if expr $3 == 6 >;/dev/null ; then M=Jun ; OK=1 ; fi
if expr $3 == 7 >;/dev/null ; then M=Jul ; OK=1 ; fi
if expr $3 == 8 >;/dev/null ; then M=Aug ; OK=1 ; fi
if expr $3 == 9 >;/dev/null ; then M=Sep ; OK=1 ; fi
if expr $3 == 10 >;/dev/null ; then M=Oct ; OK=1 ; fi
if expr $3 == 11 >;/dev/null ; then M=Nov ; OK=1 ; fi
if expr $3 == 12 >;/dev/null ; then M=Dec ; OK=1 ; fi
if expr $3 == 1 >;/dev/null ; then M=Jan ; OK=1 ; fi
if expr $OK == 1 >; /dev/null ; then
ls -l –full-time $A 2>;/dev/null | grep “$M $4″ | grep $2 ;
else
echo Usage: $0 path Year Month Day;
echo Example: $0 ~ 1998 6 30;
fi

在我们使用CentOS系统的时候,也许时区经常会出现问题,有时候改完之后还是会出错,下面分享一种方法来改变这个状况。

如果没有安装ntp时间同步组件,可以使用命令 yum install ntp 安装

然后:ntpdate us.pool.ntp.org 。

因为CentOS系统是用rhel的源码再编译的,绝大部分是完全一样的。

rhas5的时区是以文件形式存在的,当前的时区文件是在/etc/localtime

那么其他时区的文件存放在哪里呢?

在/usr/share/zoneinfo下

我们用东八区,北京,上海的时间

#cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#reboot

重启之后,date查看时间、查看当前时区 date -R、查看/修改Linux时区和时间

一、时区

1. 查看当前时区
date -R

2. 修改设置时区
方法(1)
tzselect
方法(2) 仅限于RedHat Linux 和 CentOS系统
timeconfig
方法(3) 适用于Debian
dpkg-reconfigure tzdata

3. 复制相应的时区文件,替换CentOS系统时区文件;或者创建链接文件
cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
在中国可以使用:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

二、时间

1、查看时间和日期
date

2、设置时间和日期
将CentOS系统日期设定成2011年5月16日的命令
date -s 05/16/11
将CentOS系统时间设定成下午3点33分0秒的命令
date -s 15:33:00

3. 将当前时间和日期写入BIOS,避免重启后失效
hwclock -w

三、定时同步时间
# /usr/sbin/ntpdate 210.72.145.44 > /dev/null 2>&1

这样就完成了关于设置修改CentOS系统时区的问题了。

#!/bin/sh
#
modprobe ipt_MASQUERADE
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X
###########################INPUT键###################################

iptables -P INPUT DROP
iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport –dports 110,80,25 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.0.0/24 –dport 139 -j ACCEPT
#允许内网samba,smtp,pop3,连接
iptables -A INPUT -i eth1 -p udp -m multiport –dports 53 -j ACCEPT
#允许dns连接
iptables -A INPUT -p tcp –dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
#允许外网vpn连接
iptables -A INPUT -s 192.186.0.0/24 -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp –syn -m connlimit –connlimit-above 15 -j DROP
#为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃
iptables -A INPUT -s 192.186.0.0/24 -p tcp –syn -m connlimit –connlimit-above 15 -j DROP
#为了防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃
iptables -A INPUT -p icmp -m limit –limit 3/s -j LOG –log-level INFO –log-prefix “ICMP packet IN: "
iptables -A INPUT -p icmp -j DROP
#禁止icmp通信-ping 不通
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE
#内网转发
iptables -N syn-flood
iptables -A INPUT -p tcp –syn -j syn-flood
iptables -I syn-flood -p tcp -m limit –limit 3/s –limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT
#防止SYN攻击 轻量
#######################FORWARD链###########################
iptables -P FORWARD DROP
iptables -A FORWARD -p tcp -s 192.168.0.0/24 -m multiport –dports 80,110,21,25,1723 -j ACCEPT
iptables -A FORWARD -p udp -s 192.168.0.0/24 –dport 53 -j ACCEPT
iptables -A FORWARD -p gre -s 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -p icmp -s 192.168.0.0/24 -j ACCEPT
#允许 vpn客户走vpn网络连接外网
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -p udp –dport 53 -m string –string “tencent" -m time –timestart 8:15 –timestop 12:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
#星期一到星期六的8:00-12:30禁止qq通信
iptables -I FORWARD -p udp –dport 53 -m string –string “TENCENT" -m time –timestart 8:15 –timestop 12:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
#星期一到星期六的8:00-12:30禁止qq通信
iptables -I FORWARD -p udp –dport 53 -m string –string “tencent" -m time –timestart 13:30 –timestop 20:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp –dport 53 -m string –string “TENCENT" -m time –timestart 13:30 –timestop 20:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
#星期一到星期六的13:30-20:30禁止QQ通信
iptables -I FORWARD -s 192.168.0.0/24 -m string –string “qq.com" -m time –timestart 8:15 –timestop 12:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
#星期一到星期六的8:00-12:30禁止qq网页
iptables -I FORWARD -s 192.168.0.0/24 -m string –string “qq.com" -m time –timestart 13:00 –timestop 20:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
#星期一到星期六的13:30-20:30禁止QQ网页
iptables -I FORWARD -s 192.168.0.0/24 -m string –string “ay2000.net" -j DROP
iptables -I FORWARD -d 192.168.0.0/24 -m string –string “宽频影院" -j DROP
iptables -I FORWARD -s 192.168.0.0/24 -m string –string “色情" -j DROP
iptables -I FORWARD -p tcp –sport 80 -m string –string “广告" -j DROP
#禁止ay2000.net,宽频影院,色情,广告网页连接 !但中文 不是很理想
iptables -A FORWARD -m ipp2p –edk –kazaa –bit -j DROP
iptables -A FORWARD -p tcp -m ipp2p –ares -j DROP
iptables -A FORWARD -p udp -m ipp2p –kazaa -j DROP
#禁止BT连接
iptables -A FORWARD -p tcp –syn –dport 80 -m connlimit –connlimit-above 15 –connlimit-mask 24
#######################################################################
sysctl -w net.ipv4.ip_forward=1 &>/dev/null
#打开转发
#######################################################################
sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null
#打开 syncookie (轻量级预防 DOS 攻击)
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>/dev/null
#设置默认 TCP 连接痴呆时长为 3800 秒(此选项可以大大降低连接数)
sysctl -w net.ipv4.ip_conntrack_max=300000 &>/dev/null
#设置支持最大连接树为 30W(这个根据你的内存和 iptables 版本来,每个 connection 需要 300 多个字节)
#######################################################################
iptables -I INPUT -s 192.168.0.50 -j ACCEPT
iptables -I FORWARD -s 192.168.0.50 -j ACCEPT
#192.168.0.50是我的机子,全部放行!
############################完#########################################

1、相关基础知识点
1)redhat的启动方式和执行次序是:
加载内核
执行init程序
/etc/rc.d/rc.sysinit # 由init执行的第一个脚本
/etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式
/etc/rc.d/rc.local #相应级别服务启动之后、在执行该文件(其实也可以把需要执行的命令写到该文件中)
/sbin/mingetty # 等待用户登录

在Redhat中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:
调入keymap以及系统字体
启动swapping
设置主机名
设置NIS域名
检查(fsck)并mount文件系统
打开quota
装载声卡模块
设置系统时钟
等等。
/etc/rc.d/rc则根据其参数指定的运行模式(运行级别,你在inittab文件中可以设置)来执行相应目录下的脚本。凡是以Kxx开头的
,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。调用的顺序按xx
从小到大来执行。(其中xx是数字、表示的是启动顺序)例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调用
/etc/rc.d/rc3.d/下的脚本。
值得一提的是,Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中
的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。

init在等待/etc/rc.d/rc执行完毕之后(因为在/etc/inittab中/etc/rc.d/rc的
action是wait),将在指定的各个虚拟终端上运行/sbin/mingetty,等待用户的登录。
至此,LINUX的启动结束。

2)init运行级别及指令
一、什么是INIT:
init是Linux系统操作中不可缺少的程序之一。
所谓的init进程,它是一个由内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
二、运行级别
那么,到底什么是运行级呢?
简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从1到6 ,具有不同的功能。
不同的运行级定义如下
# 0 – 停机(千万不能把initdefault 设置为0 )
# 1 – 单用户模式 # s init s = init 1
# 2 – 多用户,没有 NFS
# 3 – 完全多用户模式(标准的运行级)
# 4 – 没有用到
# 5 – X11 多用户图形模式(xwindow)
# 6 – 重新启动 (千万不要把initdefault 设置为6 )
这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)
3):chkconfig 命令(redhat 操作系统下)
不像DOS 或者 Windows,Linux 可以有多种运行级。常见的就是多用户的2,3,4,5 ,很多人知道 5 是运行 X-Windows 的级别,而 0 就 是关机了。运行级的改变可以通过 init 命令来切换。例如,假设你要维护系统进入单用户状态,那么,可以使用 init 1 来切换。在 Linux 的运行级的切换过程中,系统会自动寻找对应运行级的目录/etc/rc[0-6].d下的K 和 S 开头的文件,按后面的数字顺序,执行这 些脚本。对这些脚本的维护,是很繁琐的一件事情,Linux 提供了chkconfig 命令用来更新和查询不同运行级上的系统服务。
语法为:

chkconfig –list [name]
chkconfig –add name
chkconfig –del name
chkconfig [–level levels] name
chkconfig [–level levels] name

chkconfig 有五项功能:添加服务,删除服务,列表服务,改变启动信息以及检查特定服务的启动状态。

chkconfig 没有参数运行时,显示用法。如果加上服务名,那么就检查这个服务是否在当前运行级启动。如果是,返回 true,否则返回 false。 –level 选项可以指定要查看的运行级而不一定是当前运行级。

如果在服务名后面指定了on,off 或者 reset,那么 chkconfig 会改变指定服务的启动信息。on 和 off 分别指服务在改变运行级时的 启动和停止。reset 指初始化服务信息,无论有问题的初始化脚本指定了什么。

对于 on 和 off 开关,系统默认只对运行级 3,4, 5有效,但是 reset 可以对所有运行级有效。指定 –level 选项时,可以选择特 定的运行级。

需要说明的是,对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init 不会重新启动已经启动的服务,也不会再 次去停止已经停止的服务。

选项介绍:

–level levels
指定运行级,由数字 0 到 7 构成的字符串,如:

–level 35 表示指定运行级3 和5。
要在运行级别3、4、5中停运 nfs 服务,使用下面的命令:chkconfig –level 345 nfs off

–add name
这个选项增加一项新的服务,chkconfig 确保每个运行级有一项 启动(S) 或者 杀死(K) 入口。如有缺少,则会从缺省的init 脚本自动 建立。

–del name
用来删除服务,并把相关符号连接从 /etc/rc[0-6].d 删除。

–list name
列表,如果指定了name 那么只是显示指定的服务名,否则,列出全部服务在不同运行级的状态。

运行级文件

每个被chkconfig 管理的服务需要在对应的init.d 下的脚本加上两行或者更多行的注释。
第一行告诉 chkconfig 缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用 – 代替运行级。
第二行对服务进行描述,可以用 跨行注释。

例如,random.init 包含三行:
# chkconfig: 2345 20 80
# description: Saves and restores system entropy pool for
# higher quality random number generation.
表明 random 脚本应该在运行级 2, 3, 4, 5 启动,启动优先权为20,停止优先权为 80。

好了,介绍就到这里了,去看看自己目录下的/etc/rc.d/init.d 下的脚本吧。

设置自启动服务:chkconfig –level 345 nfs on

2. 实例介绍:
1、在linux下安装了apache 服务(通过下载二进制文件经济编译安装、而非rpm包)、apache 服务启动命令: /server/apache/bin/apachectl start 。让apache服务运行在运行级别3下面。 命令如下:

1)touch /etc/rc.d/init.d/apache
vi /etc/rc.d/init.d/apache
chown -R root /etc/rc.d/init.d/apache
chmod 700 /etc/rc.d/init.d/apache
ln -s /etc/rc.d/init.d/apache /etc/rc.d/rc3.d/S60apache #S 是start的简写、代表启动、K是kill的简写、代表关闭。60数字 代表启动的顺序。(对于iptv系统而言、许多服务都是建立在数据库启动的前提下才能够正常启动的、可以通过该数字就行调整脚本的 启动顺序))

apache的内容:
#!/bin/bash
#Start httpd service
/server/apache/bin/apachectl start

至此 apache服务就可以在运行级别3下 随机自动启动了。(可以结合chkconfig 对启动服务进行相应的调整)。
由于相关变量定义不同, 所以以下启动顺序仅供参考

3.在Redhat Redflag centos fc linux系统里面脚本的启动

先后:
第一步:通过/boot/vm进行启动 vmlinuz
第二步:init /etc/inittab
第三步:启动相应的脚本,并且打开终端
rc.sysinit
rc.d(里面的脚本)
rc.local
第四步:启动login登录界面 login
第五步:在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile

4.在Suse Linux (sles server or Desktop 10)

第一步:通过/boot/vm进行启动 vmlinuz
第二步:init /etc/inittab
第三步:启动相应的脚本,并且打开终端 /etc/init.d/boot 里面包括:
. /etc/rc.status
./etc/sysconfig/boot
./etc/init.d/boot.d下面的脚本
./etc/init.d/boot.local
rc X.d(里面的脚本)
第四步:启动login登录界面 login
第五步:在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/root/.bashrc
/root/.profile
先后:
第一步:通过/boot/vm进行启动 vmlinuz
第二步:init /etc/inittab
第三步:启动相应的脚本,并且打开终端
rc.sysinit
rc.d(里面的脚本)
rc.local
第四步:启动login登录界面 login
第五步:在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile