標籤:bin -- manage init.d shell ping $$ signal logs
執行個體:產生臨時檔案記錄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 已經成功被關閉"
[[email protected] 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 ]
[[email protected] shell_test]# ps -e | grep httpd
78797 ? 00:00:00 httpd78800 ? 00:00:00 httpd78801 ? 00:00:00 httpd78802 ? 00:00:00 httpd78803 ? 00:00:00 httpd78804 ? 00:00:00 httpd78805 ? 00:00:00 httpd78806 ? 00:00:00 httpd78807 ? 00:00:00 httpd
[[email protected] 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 已經成功被關閉
[[email protected] shell_test]# ps -e | grep httpd
[[email protected] shell_test]#
訊號類型
linux中一共有64種訊號
[[email protected] 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/bash2 #signal.sh3 #訊號捕捉4 5 trap ‘myfunc‘ 26 7 function myfunc(){8 echo ‘你正在按ctrl+c鍵,程式無法終止‘9 }10 11 i=012 13 while :14 do15 let i++16 echo $i17 sleep 118 done
[[email protected] 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
[[email protected] ~]# 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
[[email protected] ~]# 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:‘ s10 11 case $s in12 ‘yes‘)13 exit14 ;;15 ‘no‘)16 ;;17 *)18 myfunc19 ;;20 21 esac22 }23 24 i=025 26 while :27 do28 let i++29 echo $i30 sleep 131 done
選擇yes直接終止
[[email protected] shell_test]# sh signal.sh
1
2
3
^C您確定終止該進程嗎? yes or no:yes
選擇no繼續往下走,選擇其他,調用函數,繼續提示是否終止進程
[[email protected] shell_test]# sh signal.sh
1
2
^C您確定終止該進程嗎? yes or no:no
3
4
5
6
^C您確定終止該進程嗎? yes or no:1
您確定終止該進程嗎? yes or no:2
您確定終止該進程嗎? yes or no:3
您確定終止該進程嗎? yes or no:yes
[[email protected] shell_test]#
shell指令碼臨時檔案產生和使用,訊號捕捉