shell腳本臨時文件生成和使用,信號捕捉

 

Logger工具linux

logger命令向、var/log/messages文件發送消息sql

logger命令的通常形式:shell

Logger -p -i message數據庫

1)-p : 爲優先級apache

2)-i : 發送消息bash

[root@Zabbixserver shell_test]# logger -p 10 -i 'hello!' 
[root@Zabbixserver shell_test]# cat /var/log/messages | tail -2session

Apr 15 04:18:26 Zabbixserver root[83456]: hello!
Apr 15 04:18:32 Zabbixserver root[83463]: hello!

 

 

shell腳本臨時文件生成和使用,信號捕捉dom

功能:日誌時間動做記錄,可用於不少用途函數

例如:用於數據庫備份腳本中,把12和16行分別放在備份的開頭和結尾(這裏使用sleep休眠5s是爲了方便觀察)工具

1 #!/bin/bash 
2 #create_datelog.sh
3 
4 today=`date +'%Y-%m-%d'`
5 
6 filelog="${today}.log"
7 
8 if [ ! -e filelog ];then
9 touch $filelog
10 fi 
11 
12 echo "`date +'%Y-%m-%d %T'` BackupMysql start" >> $filelog
13 
14 sleep 5 
15 
16 echo "`date +'%Y-%m-%d %T'` BackupMysql end" >> $filelog
17 
18 echo ' 日誌記錄已完畢 '

[root@Zabbixserver shell_test]# sh create_datelog.sh

日誌記錄已完畢

[root@Zabbixserver shell_test]# cat 2017-04-15.log

2017-04-15 04:09:17 BackupMysql start
2017-04-15 04:09:22 BackupMysql end

 

 

實例:生成臨時文件記錄apache進程號,殺死apache進程,刪除臨時文件

  1 #!/bin/bash 
  2 #create_log.sh
  3             
  4 #1.獲取到全部httpd應用程序的進程號      
  5 #2.把進程號存入一個臨時文件中           
  6 #3.從臨時文件中取出全部的apache的進程號 
  7 #4.使用for循環用kill殺掉全部的httpd進程 
  8 #5.刪除以前生成的臨時文件   
  9 #6.輸出關閉進程後的消息     
 10 #$$當前程序運行時候開闢的pid
 11             
 12 tmpfile=$$.txt              
 13             
 14 ps -e | grep httpd | awk '{print $1}' >>$tmpfile
 15             
 16 for pid in `cat $tmpfile`   
 17 do          
 18         echo "apache ${pid} is killed!!!"
 19         kill -9 $pid        
 20 done        
 21             
 22 sleep 1     
 23             
 24 rm -rf $tmpfile             
 25 echo "apache 已經成功被關閉"

 

 

[root@Zabbixserver shell_test]# /etc/init.d/httpd restart

Stopping httpd: [ OK ]
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]

 

[root@Zabbixserver shell_test]# ps -e | grep httpd

78797 ? 00:00:00 httpd
78800 ? 00:00:00 httpd
78801 ? 00:00:00 httpd
78802 ? 00:00:00 httpd
78803 ? 00:00:00 httpd
78804 ? 00:00:00 httpd
78805 ? 00:00:00 httpd
78806 ? 00:00:00 httpd
78807 ? 00:00:00 httpd

 

[root@Zabbixserver shell_test]# sh create_log.sh

apache 78797 is killed!!!
apache 78800 is killed!!!
apache 78801 is killed!!!
apache 78802 is killed!!!
apache 78803 is killed!!!
apache 78804 is killed!!!
apache 78805 is killed!!!
apache 78806 is killed!!!
apache 78807 is killed!!!
apache 已經成功被關閉

 

[root@Zabbixserver shell_test]# ps -e | grep httpd
[root@Zabbixserver shell_test]#

 

信號類型

linux中一共有64種信號

[root@Zabbixserver shell_test]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2

 

SIGHUP :掛起進程【1】  重載配置文件:kill -HUP +進程號 , kill -1 , pkill -HUP + 進程名字

SIGINT :來自鍵盤的中斷ctrl+c【2】

SIGQUIT :從鍵盤退出ctrl+\【3】

SIGKILL :無條件終止【9】

 

Trap信號捕捉

捕捉到一個信號後,它可能會採起下面三種操做之一:

1.不採起任何行動,由系統來處理

2.捕捉信號,但忽略它

3.捕捉該信號,但採起相應的行動

Trap命令使用:

trap "function" signal

1)signal爲接受到的信號

2)function爲執行函數(動做)

 

常見行動:

  1)清除臨時文件

  2)忽略該信號

  3)詢問用戶是否終止腳本執行

 

trap信號捕捉

1 #!/bin/bash
2 #signal.sh
3 #信號捕捉
4 
5 trap 'myfunc' 2
6 
7 function myfunc(){
8    echo '你正在按ctrl+c鍵,程序沒法終止'
9 }
10 
11 i=0
12 
13 while :
14 do
15    let i++
16    echo $i
17   sleep 1
18 done

 

[root@Zabbixserver shell_test]# sh signal.sh
1
2
3
4
5
6
7
^C你正在按ctrl+c鍵,程序沒法終止
8
9
^C你正在按ctrl+c鍵,程序沒法終止
10
11
12
^C你正在按ctrl+c鍵,程序沒法終止
13
14
^C你正在按ctrl+c鍵,程序沒法終止
15
^C你正在按ctrl+c鍵,程序沒法終止
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Killed

在開啓一個窗口,殺死腳本進程,以終止

Last login: Sat Apr 15 02:27:19 2017 from 172.30.1.21
[root@Zabbixserver ~]# ps -ef | grep signal
root 260 2 0 Apr14 ? 00:00:00 [scsi_eh_0]
root 261 2 0 Apr14 ? 00:00:00 [scsi_eh_1]
root 284 2 0 Apr14 ? 00:00:00 [scsi_eh_2]
root 1472 1 0 Apr14 ? 00:00:01 /usr/sbin/vmware-vmblock-fuse -o subtype=vmware-vmblock,default_permissions,allow_other /var/run/vmblock-fuse
root 2849 2767 0 Apr14 ? 00:00:00 /usr/libexec/gdm-simple-slave --display-id /org/gnome/DisplayManager/Display1
gdm 2958 1 0 Apr14 ? 00:00:00 /usr/bin/dbus-launch --exit-with-session
root 3131 3021 0 Apr14 ? 00:00:00 gnome-session
root 3139 1 0 Apr14 ? 00:00:00 dbus-launch --sh-syntax --exit-with-session
root 3140 1 0 Apr14 ? 00:00:00 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
zabbix 72407 72387 0 01:25 ? 00:00:00 /usr/local/zabbix/sbin/zabbix_server: housekeeper [deleted 0 hist/trends, 0 items, 0 events, 0 sessions, 0 alarms, 0 audit items in 0.002925 sec, idle for 1 hour(s)]
root 80834 4904 0 03:30 pts/0 00:00:00 sh signal.sh
root 80872 80807 0 03:30 pts/2 00:00:00 grep signal


[root@Zabbixserver ~]# kill -9 80834

 

trap信號捕捉升級版

 1 #!/bin/bash
 2 #signal.sh
 3 #信號捕捉
 4 #與用戶進行交互
 5 
 6 trap 'myfunc' 2
 7 
 8 function myfunc(){
 9   read -p '您肯定終止該進程嗎? yes or no:' s
10 
11   case $s in
12     'yes')
13       exit
14       ;;
15     'no')
16       ;;
17     *)
18       myfunc
19       ;;
20 
21   esac
22 }
23 
24 i=0
25 
26 while :
27 do
28   let i++
29   echo $i
30   sleep 1
31 done

 

 

選擇yes直接終止

[root@Zabbixserver shell_test]# sh signal.sh
1
2
3
^C您肯定終止該進程嗎? yes or no:yes

 

選擇no繼續往下走,選擇其餘,調用函數,繼續提示是否終止進程

[root@Zabbixserver shell_test]# sh signal.sh 12^C您肯定終止該進程嗎? yes or no:no3456^C您肯定終止該進程嗎? yes or no:1您肯定終止該進程嗎? yes or no:2您肯定終止該進程嗎? yes or no:3您肯定終止該進程嗎? yes or no:yes[root@Zabbixserver shell_test]#

相關文章
相關標籤/搜索