Linux Shell 高级编程技巧2----shell工具
2.shell工具
2.1.日志文件
简介
创建日志文件是很重要的,记录了重要的信息。一旦出现错误,这些信息对于我们排错是非常有用的;监控的信息也可以记录到日志文件
常用的日志文件的方法
以时间为标识的日志文件
例子
#!/bin/bash #当前的日期 current_date=`date "+%Y%m%d"` #今天的日志文件名 todaylog="log/${current_date}.log" #如果日志文件不存在,创建一个 if [! -f $todaylog ] then touch $todaylog fi #输出日志到日志文件 log_time_format=`date "+%Y-%m-%d %T"` echo "${log_time_format} 命令开始" >>$todaylog # #command blocks sleep 4 # #输出日志到日志文件 log_time_format=`date "+%Y-%m-%d %T"` echo "${log_time_format}命令结束" >>$todaylog
以进程号为标识的临时文件
例子
#!/bin/bash #取得当前进程号 current_PID=$$ #获得特定进程的进程号并重定向到一个临时文件中 ps -aux | grep "/user/sbin/httpd" | grep -v "grep" | awk '{print $2}' > /tmp/${current_PID}.txt #命令块开始 for pid in `cat /tmp/${current_PID}.txt` do { echo "kill -9 $pid kill -9 $pid } done #命令块结束 #删除临时文件 rm -f /tmp/${current_PID}.txt
2.2.信号
简介
信号就是系统向脚本或命令发出的消息,告知它们某个事件的发生
kill命令
kill -l 列出所有的信号
列出一些常用信号
1 SIGHUP 挂起或父进程被杀死
2 SIGINT 来自键盘的中断信号,通常是 Ctrl-C
3 SIGQUIT 从键盘退出
9 SIGKILL 无条件退出
11 SIGSEGV 段(内存)冲突
15 SIGTERM 软件终止(缺省杀进程)
信号0为”退出shell“信号。为了发出信号0,只要从命令行键入exit,或者在一个进程或命令行中使用 Ctrl-D 即可
kill 发送信号给进程
例子
kill -s 信号名 进程号 这种格式来给进程发送相应信号
kill -s SIGKILL 7696 杀死进程号为7696的进程
kill -信号的编号 进程号 这种格式来给进程发送对应的信号
kill -9 7696 杀死进程号为7696的进程
2.3.trap捕捉信号
简介
信号可以被应用程序或脚本捕获,并依据该进程号(1、2、3和15)采取相应的行动。一些信号不能被捕获。例如,如果一个命令收到了信号9,就无法再捕捉其他信号
捕捉到一个信号后,它可能会采取下面的三种操作之一
1.不采取任何行动,由系统来进行处理
2.捕获该信号,但是忽略它
3.捕捉该信号,并采取相应行动
trap可以使你在脚本中捕捉信号。命令格式是:trap name signal(s)
其中name是捕捉到信号以后所采取的一系列操作。实际中,name一般是一个专门用来处理所捕捉信号的函数。name需要用双引号""引起来。
signal就是待捕捉的信号
最常见的行动是
1.清除临时文件
2.忽略该信号 例子:trap "" 2 3
3.询问用户是否终止该脚本的运行
例子1
#!/bin/bash #捕获信号2,如果捕获到就执行exitprocess trap "exitprocess" 2 LOOP=0 function exitprocess() { echo "You just hit <CTRL-C>, at number $LOOP" echo "I will now exit" exit 1 } while: do LOOP=$[$LOOP+1] echo $LOOP sleep 1 done
例子2
#!/bin/bash LOOP=0 trap "exitprocess" 2 HOLD1=/tmp/hold1.$$ HOLD2=/tmp/hold2.$$ function exitprocess() { echo -e "\nRecived Interrupt...." echo -n "Do you really wish to exit?(Y/N)" read ANS case $ANS in Y|y) rm_tmp_file ;; N|n) ;; *) exitprocess ;; esac } function rm_tmp_file() { echo "<CTRL-c> detected .. Now cleaning up ... Wait" rm /tmp/*.$$ 2>/dev/null exit 1 } while : do LOOP=$[$LOOP+1] echo $LOOP df >> $HOLD1 ps -xa >> $HOLD2 sleep 1 done
2.4.eval
简介
eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量
例子,myfile 文件的内容是 ls -l
MYFILE="cat myfile";`eval $MYFILE`
等价于 eval `cat myfile`
也就是执行 cat myfile 输出结果所代表的那条命令
2.5.logger
简介:
logger命令向/var/log/messages文件发送消息
logger命令一般形式是:
logger -p -i message
-p 为优先级,这里只涉及到提示用户注意的优先级,这也是缺省值
-i 在每个信息中记录发送消息的进程号
例子
logger -p -i "chinaitlab shenzhen"
查看 /var/log/messages 就可以查看插入了这条信息