嵌入式成长轨迹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 在每个消息中记录发送消息的进程号

原文地址:https://www.cnblogs.com/zeedmood/p/2382482.html