Shell编程笔记(日志文件、信号、trap捕捉信号、eval)

 

 

一.日志文件
1.创建日志文件的重要性:
记录重要的信息,如登录、运行情况、监控等。。为我们分析和排除错误非常有帮助
2.以时间为标识的日志文件
适用于长期存储的日志。举个创建以时间为标识日志的例子入下:
#!/bin/bash
#datelog.sh
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} commands start.....">>${todaylog}
# commands blocks
sleep 4
log_time_format=`date "+%Y-%m-%d %T"`
echo "${log_time_format} commands end!">>${todaylog} #结束时记录日志
3.以进程号为标识的临时文件
一般记录脚本运行过程中需要暂时记录的信息,一旦脚本运行结束,这些信息就可以删除。举个以进程号为标识的日志的例子:
#!/bin/bash
#kill_process.sh
#取得当前进程号
current_pid=$$
#获得特定进程号并重定向到一个临时文件中
ps -aux|grep "/usr/sbin/httpd" | grep -v "grep"| awk '{print $2}' >/tmp/${current_pid}.txt
#commands start
for pid in `cat /tmp/${current_pid}.txt
do
{
echo "kill -9 $pid"
kill -9 $pid
}
done 
rm -f /tmp/${current_pid}.txt //脚本运行结束前删除该日志文件

二.信号
(1). 信号就是系统向脚本或命令发出的消息,告知它们某个事情的发生。
(2). kill -l 列出所有的信号
(3). kill发送信号给进程
(4). 一些信号的含义:
信号 信号名 含义
0 退出shell信号,可以从命令行输入exit或在一个进程或命令行中使用<CTRL-d>
1 SIGHUP 挂起或父进程被杀死
2 SIGINT 来自键盘的中断信号,通常是<CTRL-C>
3 SIGOUIT 从键盘退出
9 SIGKILL 无条件终止
11 SIGSEGV 段(内存)冲突
15 SIGTERM 软件终止(缺省杀进程)

24 SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号 
(另外还有50多种信号,可以用kill -l 命令查看)
(5). 举例说明:kill -s SIGKILL 1234 表示无条件终止进程1234(进程号)
通过kill -9 1234 其含义与上面一样。
kill -1 1234 和kill -s SIGHUP 1234都是挂起 进程号为1234的进程

三.trap捕捉信号
(1)信号可以被应用程序或脚本捕获,并依据该信号(1、2、3和15)采取相应的行动。一些信号不能被捕获。如,如果一个命令收到了信号9,就无法再捕获其他信号。
(2)捕捉到一个信号后,可能会采取三中
1].不采取任何行动,由系统来进行处理(如信号9由系统处理)
2].捕获该信号,但忽略它
3].捕获该信号,并采取相应的行动
(3)trap可以使你在脚本中捕捉信号,命令形式为trap name signal(s)
其中,name是捕捉到信号以后所采取的一系列操作。实际中,name一般是一个专门用来处理所捕捉信号的函数。name需要用双引号(“”)引起来。signal是待捕捉的信号。
最常见的行动包括:
1]清除临时文件
2]忽略该信号(如trap "" 23)
3]询问用户是否终止该脚本进程
(4)举例说明:
#!/bin/bash
#trap.sh
trap 'exitprocess' 2    #捕捉到信号2之后执行exitprocess function
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

四.eval
(1)eval命令首先会扫描命令行进行所有的置换,然后再执行该命令。该命令适用于那些一次扫描无法实现其功能的变量。
(2)举例:myfile="cat command.txt";`eval $myfile` 将会执行command.txt中的命令,如,若command.txt文件的内容是ls -al 则会执行该命令(一行行执行),若不是命令则提示出错信息。
五.logger
(1)logger命令向/var/log/messages文件发送信息
(2)logger命令的一般形式: logger -p -i message
-p:为优先级别,这里只涉及到提示用户注意的优先级,这也是缺省值
-i:在每个消息中记录发送消息的进程号
(3)举例说明:logger -p 5 -i "hello" 将“hello”记录到/var/log/messages中

 

SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联.   

SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出   

SIGQUIT 和SIGINT类似, 但由QUIT字符(通常是Ctrl-\)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号.   

SIGILL 执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号. 
  
SIGABRT 程序自己发现错误并调用abort时产生.   

SIGIOT 在PDP-11上由iot指令产生, 在其它机器上和SIGABRT一样.  
 
SIGBUS 非法地址, 包括内存地址对齐(alignment)出错. eg: 访问一个四个字长的整数, 但其地址不是4的倍数.  
 
SIGFPE 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误. 
  
SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略.   

SIGUSR1 留给用户使用   

SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.  

SIGUSR2 留给用户使用   

SIGPIPE Broken pipe   

SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.   

SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号.   

 SIGCHLD 子进程结束时, 父进程会收到这个信号.  
 SIGCONT 让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符   

SIGSTOP 停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别: 该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.   

SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号  

 SIGTTIN 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行. 

 SIGTTOU 类似于SIGTTIN, 但在写终端(或修改终端模式)时收到. 

 SIGURG 有紧急数据或out-of-band数据到达socket时产生.  
 
 SIGXCPU 超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变  
 
 SIGXFSZ 超过文件大小资源限制.   

 SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.  

 SIGPROF 类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间. 

 SIGWINCH 窗口大小改变时发出.  

 SIGIO 文件描述符准备就绪, 可以开始进行输入/输出操作.  

 SIGPWR Power failure

你可能感兴趣的:(shell,职场,休闲)