shell 腳本編程之信號捕捉和主機探測shell
===============================================================================編程
概述:centos
===============================================================================api
1.寫一個腳本,探測192.168.0.0網段中主機在線狀態安全
[root@centos7 bin]# cat ping.sh #!/bin/bash #authoe:tao #describtion:給定一個網絡地址,並探測此網絡中主機的在線狀態,並統計出在線主機和離線主機的個數 read -p "請輸入您的IP地址: " IP declare -i i=0 declare -i j=0 address=$(echo $IP |egrep "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])") arg3=$(echo $IP |cut -d. -f1-3). if [[ -z "$IP" ]];then echo "At least one IPv4." && exit 1 elif [[ "$IP" == "$address" ]];then for arg4 in $(seq 100 110);do if ping -c1 -W1 $arg3$arg4 &> /dev/null ;then echo -e "$arg3$arg4\tup." let i++ else echo -e "$arg3$arg4\tdown." let j++ fi done else echo "您輸入的格式不正確,請從新輸入!" && exit 2 fi echo "在線主機的個數爲:$i" echo "不在線主機的個數爲:$j" #================================================================================== [root@centos7 bin]# bash ping.sh 請輸入您的IP地址: At least one IPv4. [root@centos7 bin]# bash ping.sh 請輸入您的IP地址: 192.168.1 您輸入的格式不正確,請從新輸入! [root@centos7 bin]# bash ping.sh 請輸入您的IP地址: 192.168.1.0 192.168.1.100 up. 192.168.1.101 up. 192.168.1.102 up. 192.168.1.103 down. 192.168.1.104 down. 192.168.1.105 down. 192.168.1.106 up. 192.168.1.107 down. 192.168.1.108 down. 192.168.1.109 down. 192.168.1.110 down. 在線主機的個數爲:4 不在線主機的個數爲:7
2.寫一個腳本探測 A類,B類,C類網絡中主機的在線狀態bash
# 以下定義的A,B,C三類網絡探測的函數腳本,能夠按需調用函數執行便可 [root@centos7 function]# cat hostping.sh #!/bin/bash # cping() { local i=1 while [ $i -le 5 ];do if ping -c1 -W1 $1.$i &> /dev/null; then echo "$1.$i is up." else echo "$1.$i is down." fi let i++ done } bping() { local j=0 while [ $j -le 5 ];do cping $1.$j let j++ done } aping() { local k=0 while [ $k -le 5 ];do bping $1.$k let k++ done } aping 10 bping 172.16 cping 192.168.1
1.定義和功能:
網絡
★列出信號:ide
trap -l函數
kill -lui
☉獲取幫助:
man 7 single
☉每一個信號有三種表示方式:
信號的數字標識;如 1
信號的完整名稱;如 SIGHUB
信號的簡寫名稱;如 HUB
☉經常使用的信號:
SIGHUP,1:無須從新啓動進程而讓其重讀配置文件,並生效;
SIGINT,2:打斷正在運行的進程;至關於Ctrl+c;
SIGKILL,9:強行終止(殺死)正在運行的進程;
SIGTERM,15:安全終止正在運行的進程;
SIGCONT,18:繼續運行指定的進程;
SIGSTOP,19:暫停進程;
★trap命令用法:
☉語法:
trap 'COMMAND' SINGLE
☉經常使用來捕捉的信號:
HUB ,INT
演示:
1.列出全部信號
[root@centos7 function]# 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 63) SIGRTMAX-1 64) SIGRTMAX [root@centos7 function]# trap -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 63) SIGRTMAX-1 64) SIGRTMAX
2.trap 命令 在接受到 INT信號時,就會執行定義的命令和參數
[root@centos7 bin]# cat trap.sh #!/bin/bash # trap 'echo "逗你玩!!!"' INT for i in {100..250};do ping -c1 -W1 192.168.1.$i done # 執行結果以下:即每次執行 Ctrl+c 都會發送INT 信號,因此都會顯示信息, PING 192.168.1.247 (192.168.1.247) 56(84) bytes of data. ^C --- 192.168.1.247 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms 逗你玩!!! PING 192.168.1.248 (192.168.1.248) 56(84) bytes of data. ^C --- 192.168.1.248 ping statistics --- 1 packets transmitted, 0 received, 100% packet loss, time 0ms 逗你玩!!! #========================================================================= # 爲了避免使如上的循環一直執行下去,咱們能夠傳送 exit 命令,即腳本只要已收到INT信號就執行 Quit 並退出 [root@centos7 bin]# cat trap.sh #!/bin/bash # trap 'echo "Quit";exit 1' INT for i in {100..250};do ping -c1 -W1 192.168.1.$i done
3.在接收到INT信號時,由於命令尚未結束,可是又想把命令產生的文件刪除,則能夠定義一個函數,在使用 trap 命令時直接調用函數便可,示例以下:
[root@centos7 bin]# cat trap.sh #!/bin/bash # mytrp() { echo "Quit" rm -f ${hostmpfiles[*]} exit 1 } declare -a hosmpfiles trap 'mytrp' INT for i in {100..250};do tmpfile=$(mktemp /tmp/ping.XXXXXX) if ping -c1 -W1 192.168.1.$i &> /dev/null; then echo "192.168.1.$i is up" |tee $tmpfile else echo "192.168.1.$i is down" |tee $tmpfile fi hostmpfiles[${#hostmpfiles[*]}]=$tmpfile done rm -f ${hostmpfiles[*]}