shell 脚本编程之信号捕捉和主机探测
===============================================================================
概述:
===============================================================================
主机探测
1.写一个脚本,探测192.168.0.0网段中主机在线状态
[[email protected] 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" #================================================================================== [[email protected] bin]# bash ping.sh 请输入您的IP地址: At least one IPv4. [[email protected] bin]# bash ping.sh 请输入您的IP地址: 192.168.1 您输入的格式不正确,请重新输入! [[email protected] 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类网络中主机的在线状态
# 如下定义的A,B,C三类网络探测的函数脚本,可以按需调用函数执行即可 [[email protected] 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.定义和功能:
★列出信号:
- 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.列出所有信号
[[email protected] 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 [[email protected] 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信号时,就会执行定义的命令和参数
[[email protected] 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 并退出 [[email protected] 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 命令时直接调用函数即可,示例如下:
[[email protected] 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[*]}
时间: 2024-10-10 00:17:18