shell 脚本编程之信号捕捉和主机探测
===============================================================================
概述:
===============================================================================
主机探测
1.写一个脚本,探测192.168.0.0网段中主机在线状态
[root@centos7 bin]# cat ping.sh #!/bin/bash#authoe:tao#describtion:给定一个网络地址,并探测此网络中主机的在线状态,并统计出在线主机和离线主机的个数read -p "请输入您的IP地址: " IPdeclare -i i=0declare -i j=0address=$(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 1elif [[ "$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 doneelse echo "您输入的格式不正确,请重新输入!" && exit 2fiecho "在线主机的个数为:$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.0192.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类网络中主机的在线状态
# 如下定义的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 10bping 172.16cping 192.168.1
信号捕捉
1.定义和功能:
★列出信号:
trap -l
kill -l
☉获取帮助:
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) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) 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) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX
2.trap 命令 在接受到 INT信号时,就会执行定义的命令和参数
[root@centos7 bin]# cat trap.sh#!/bin/bash#trap 'echo "逗你玩!!!"' INTfor i in {100..250};do ping -c1 -W1 192.168.1.$idone # 执行结果如下:即每次执行 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' INTfor i in {100..250};do ping -c1 -W1 192.168.1.$idone
3.在接收到INT信号时,因为命令还没有结束,但是又想把命令产生的文件删除,则可以定义一个函数,在使用 trap 命令时直接调用函数即可,示例如下:
[root@centos7 bin]# cat trap.sh #!/bin/bash#mytrp() { echo "Quit" rm -f ${hostmpfiles[*]} exit 1}declare -a hosmpfilestrap 'mytrp' INTfor 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[*]}]=$tmpfiledonerm -f ${hostmpfiles[*]}