嵌入式成长轨迹12 【嵌入式环境及基础】【Linux shell深入】【shell工具】
一、日志文件
记录了一些重要信息,可以用于监控、排错
1、以时间为标识的日志文件
长期保留
【示例脚本】
#!/bin/bash
#datelog.sh
#当前的日期
current_date=`date "+%Y%m%d"`
#今天的日志文件名
todaylog="${current_date}.log"
#如果日志文件不存在,创建一个
if [ ! -f $todaylog ]
#注意上边的空格一个都不能少
then
#注意touch无法创建目录,所以之前文件名不能包含新目录
#否则就有touch: 无法触碰 “log/20120228.log”: 没有那个文件或目录
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
2、以进程号为标识的临时文件
脚本中用来记录临时数据,以供程序使用
【示例脚本】
1 #!/bin/bash
2 #processlog.sh
3
4 #取得当前进程号
5 current_PID=$$
6 #获得特定进程的进程号并重定向到一个临时文件中
7 ps -aux|grep "/usr/sbin"|grep -v "grep"|awk '{print $2}'>./${current_PID}.txt
8 #命令块开始
9 #for pid in "cat /tmp/${current_PID}.txt"
10 #do
11 #done
12 #命令块结束
13 #删除临时文件
14 rm -f /tmp/${current_PID}.txt
二、信号
信号就是系统向脚本或命令发出的消息,告知它们某个事件的发生
kill -l 列出所有的信号
kill发生信号给进程
SIGHUP 1 A 终端挂起或者控制进程终止
SIGINT 2 A 键盘中断(如break键被按下)
SIGQUIT 3 C 键盘的退出键被按下
SIGKILL 9 AEF Kill信号
SIGSEGV 11 C 无效的内存引用
SIGTERM 15 A 终止信号
信号0为退出shell信号,要发出它只要从命令行键入exit,或在下一个进程或命令行中使用<CTRL-D>即可
如
kill -SIGKILL xxxx 或者
kill -9 xxxx 都可以杀死进程
信号1可以通过杀死父进程来杀死所有子进程
三、trap捕捉信号
一些信号可以被应用程序或脚本捕获,并依据该信号采取相应行动。但注意,如果一个命令收到了信号9,就无法再捕捉其他信号
trap可以用来在脚本中捕捉信号,命令形式为: trap name signal
其中,name是捕捉到信号后采取的一系列操作,通常是一个函数。它需要用双引号引起来
最常见的行动包括:
1)清除临时文件
2)忽略该信号
3)询问用户是否终止该脚本的运行
【示例1】
#!/bin/bash
#trap1.sh
trap "exitprocess" 2
LOOP=0
function exitprocess()
{
echo "You just hit <CTRL-C>,at num $LOOP"
echo "I will now exit"
exit 1
}
while :
do
LOOP=$[ $LOOP+1 ]
echo $LOOP
sleep 1
done
【示例2】
1 #!/bin/bash
2 #trap2.sh
3
4 LOOP=0
5 trap "exitprocess" 2
6 HOLD1=/tmp/hold1.$$
7 HOLD2=/tmp/hold2.$$
8 function exitprocess()
9 {
10 echo -e "\nReceive Interrupt ..."
11 echo -n "Do you realy wish to exit?(Y/N)"
12 read ANS
13 case $ANS in
14 Y|y)
15 rm_tmp_file
16 ;;
17 N|n)
18 ;;
19 *)
20 exitprocess
21 ;;
22 esac
23 }
24
25 function rm_tmp_file
26 {
27 echo "<CTRL-C> detected .. Now cleaning up .. wait"
28 rm /tmo/*.$$ 2>/dev/null
29 exit 1
30 }
31 while :
32 do
33 LOOP=$[$LOOP+1]
34 echo $LOOP
35 df>>$HOLD1
36 ps -xa >>$HOLD2
37 sleep 1
38 done
39
40 }
四、eval
eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量
如
MYFILE="cat myfile";`eval $MYFILE`
【终端示例】
#eval演示
[root@localhost ~]# cat test.sh
ls -l
[root@localhost ~]# myfile="cat test.sh";`eval $myfile`
总计 152
-rw------- 1 root root 1982 2009-03-28 anaconda-ks.cfg
-rwxr-xr-x 1 root root 684 02-28 19:40 datelog.sh
-rwxr-xr-x 1 root root 417 02-26 21:11 hellofun.sh
-rw-r--r-- 1 root root 61777 2009-03-28 install.log
-rw-r--r-- 1 root root 6410 2009-03-28 install.log.syslog
-rwxr-xr-x 1 root root 348 02-28 20:19 processlog.sh
-rw-r--r-- 1 root root 132 02-22 19:31 testfile.dat
-rw-r--r-- 1 root root 6 02-28 21:06 test.sh
-rwxr-xr-x 1 root root 220 02-28 20:52 trap1.sh
-rwxr-xr-x 1 root root 468 02-28 21:01 trap2.sh
drwxr-xr-x 2 root root 4096 2010-04-22 公共的
drwxr-xr-x 2 root root 4096 2010-04-22 模板
drwxr-xr-x 2 root root 4096 2010-04-22 视频
drwxr-xr-x 2 root root 4096 2010-04-22 图片
drwxr-xr-x 2 root root 4096 02-28 20:45 文档
drwxr-xr-x 2 root root 4096 2010-04-22 下载
drwxr-xr-x 2 root root 4096 2010-04-22 音乐
drwxr-xr-x 2 root root 4096 2010-04-22 桌面
[root@localhost ~]# vi test.sh
[root@localhost ~]# cat test.sh
ls
[root@localhost ~]# myfile="cat test.sh";`eval $myfile`
anaconda-ks.cfg install.log testfile.dat trap2.sh 视频 下载
datelog.sh install.log.syslog test.sh 公共的 图片 音乐
hellofun.sh processlog.sh trap1.sh 模板 文档 桌面
五、logger
logger命令向/var/log/message文件发送消息
logger命令的一般形式为 logger -p -i message
-p 为优先级,这里只涉及提示用户注意的优先级,也是缺省值
-i 在每个消息中记录发送消息的进程号