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[*]}