Chinaunix首页 | 论坛 | 博客
  • 博客访问: 869014
  • 博文数量: 366
  • 博客积分: 10267
  • 博客等级: 上将
  • 技术积分: 4290
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-24 14:04
文章分类

全部博文(366)

文章存档

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 ,at number $LOOP"   #打印这句话

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

 

 

 

 

 

 

HeCflower
阅读(1073) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~