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 就可以查看插入了这条信息