shell 脚本编程之信号捕捉和主机探测

===============================================================================

概述:


===============================================================================

主机探测

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类网络中主机的在线状态

# 如下定义的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.定义和功能:

列出信号:

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