2012年(366)
分类: 系统运维
2012-04-10 19:18:17
拖拖拉拉,拖拖拉拉的,终于认认真真的把shell高级部分的第二章看完了。
----------------------------------------------------------------------------------------
linux shell的高级编程技巧
红色为需要记忆,绿色为标题,黄色为解释用途。
第二章:shell工具-----------------日志文件/信号/Trap捕捉信号/Eval/ Logger/
日志文件=====================================================================================
以时间为标志的日志文件脚本例子:(掌握date命令使用)
[root@localhost ~]# vi datelog.sh #脚本用于估算脚本运行的时间等
----------------------------------------------------------------------------------------------------------------------------------------
#!/bin/bash
#datelog.sh
current_date=`date "+%Y%m%d"` #定义变量为命令输出,用反引号引用,蓝色部分表示当前年月日
todaylog="/log/${current_date}.log" #定义变量内容 ” “符号确定范围
if [ ! -f $todaylog ] #意思是如果变量todaylog不存在,那么touch此文件
then
touch $todaylog
fi
#输出日志到日志文件
log_time_format=`date "+%Y-%m-%d %T"`
echo "${log_time_format} 命令开始" >>$todaylog
#command blocks
sleep 4 #休眠4秒
#输出日志到日志文件
echo "${log_time_format}命令结束" >>$todaylog
----------------------------------------------------------------------------------------------------------------------------------------
以进程为标志的日志文件脚本举例:
[root@localhost ~]# vi proccesslog.sh #脚本用于用于杀死所有httpd的进程,释放内存
-----------------------------------------------------------------------------------------------------------------------------------------
#!/bin/bash
#kill_process.sh
#取得当前进程号
current_PID=$$ # $$为特殊变量,表示当前进程号
ps -aux|grep "httpd"|grep -v "grep"|awk '{print $2}'>/tmp/${current_ PID}.txt #获取httpd的进程并且导出至文件
for pid in `cat /tmp/${current_ PID}.txt` # for… in…. 循环
do
{
echo “kill -9 $pid”
kill -9 $pid
}
done
rm –rf /tmp/${current_ PID}.txt # 删除脚本执行中创建的文件
-------------------------------------------------------------------------------------------------------------------------------------------------
信号=======================================================================================
1--------SINGUP----------挂起或者父进程被杀死
2--------SINGINT---------来自键盘的中断,就是CTRL+C
3--------SIGQUIT----------从键盘退出
9--------SIGKILL----------无条件终止
0--------SIGTERM------命令行键入exit,就是 CTRL+D
[root@localhost ~]# kill -s SIGKILL 1187 # 杀死1187等同于kill -9 1187
[root@localhost ~]#kill –l #列出kill的信号
----------------------------------------------------------------------------------------------------------------------------------------
trap捕捉信号---------trap可以在不同脚本之间进行进程通信
trap name signals # Signal是待捕捉的信号。name是捕捉到信号后所采取的操作,经常是函数。需用单引号、双引号引起来,常见的行动是清除临时文件/忽略该信号/询问用户是否终止该脚本的运行
trap脚本例子1:
[root@localhost ~]# vi trap1.sh #脚本的意思是:一直运行while do循环,直到捕捉到信号2的时候,执行exitprocess函数,此脚本的主程序是while do循环
-------------------------------------------------------------------------------------------------------------------------------------------
#!/bin/bash
#trap1.sh
trap “exitprocess” 2 # 捕捉的信号2的时候,执行exitprocess函数
LOOP=0 # 定义变量LOOP
function exitprocess() #这里是exitprocess函数的内容
{
echo "You just hit
echo "I will exit,now" #打印这句话
exit #退出命令
} # exitprocess函数结束
while : #这里是一个while…do 循环
do
LOOP=$[$LOOP+1]
echo $LOOP
sleep 1
done
----------------------------------------------------------------------------------------------------------------------------------------------
trap脚本例子2: 与trap1.sh脚本差不多,多出一个case in 语句,主语句仍然是while do
[root@centos55 ~]# vi trap2.sh
-----------------------------------------------------------------------------------------------------------------------------------------------
#!/bin/bash
trap "exitprocess" 2
function exitprocess()
{
echo "signal 2 recieved,interrupting"
echo "really interrupt?(y/n)"
read TYPE # 从键盘读入一下变量TYPE
case $TYPE in #这里是一个case in语句
Y|y)
exit
;;
N|n)
;;
*) exitprocess
;;
esac # case in语句结束
}
LOOP=0
while :
do
LOOP=$[$LOOP+1]
echo $LOOP
sleep 1
done
-----------------------------------------------------------------------------------------------------------------------------------------------
eval=======================================================================================
eval进行一次命令行扫描置换,再执行该命令,用于一次扫描无法实现其功能的变量
例子1:
[root@centos55 ~]# eval `cat test` #这里,如果test文件的内容是ls-l ,那么整体的这个命令将列出当目录下面的文件
logger=====================================================================================
logger命令向/var/log/message文件写入消息
命令的格式一般为 logger –p –i message # -p表示privillege优先级,-i在消息中记录发送信息的进程号
例子1:
[root@centos55 ~]# logger -i "we are finished,today" # 然后再运行cat /var/log/messages即可看到Apr 8 02:58:09 centos55 root[3112]: we are finished,today