1、基础知识
查看系统信号
使用命令 kill -l和trap -l
[root@localhost ~]# 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
[root@localhost ~]#
2、键盘控制信号 1,2,3,15,20
信号 | 说明 |
HUP(1) | 挂起,通常因终端掉线或用户退出而引发 |
INT(2) | 中断,通常因按下Ctrl+C 组合键而引发 |
QUIT(3) | 退出,通常因按下Ctrl+/组合键而引发 |
ABRT(6) | 中止,通过某些严重的执行错误而引发 |
ALRM(14) | 报警,通常用来处理超时 |
TERM(15) | 终止,通常在系统关机时发送 |
TSTP(20) | 停止进程的运行。但该信号可以被处理和忽略,用户键入SUSP字符(通常是CTRL+Z)发出这个信号 |
用stty -a 可以列出中断信号与键盘的对应
[root@localhost ~]# stty -a
speed 38400 baud; rows 25; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
[root@localhost ~]#
3、 trap命令
trap 命令是内置命令,用help trap 查看帮助;trap命令用于在接受到信号后将要采取的行动;
trap 常见用途是在脚本程序中断被中断时完成清理工作
trap -l 把所有信号打印出来
trap -p 把当前的trap设置打印出来
trap “” signals ****为空表示这个信号失效
trap “cmd” signals ****收到signals 指定信号时,信号功能复位同时执行cmd命令
Trap signals **** 没有命令部分,信号恢复
实例
[root@localhost ~]# trap -p
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
[root@localhost ~]# trap "" 2 ===Ctrl+C 失效
[root@localhost ~]# trap 2 ====Ctrl+C 恢复
[root@localhost ~]# ^C
[root@localhost ~]# ^C
[root@localhost ~]#
[root@localhost ~]# trap "echo -n 'you are trping ctrl+c'" 2
[root@localhost ~]# ^Cyou are trping ctrl+c
[root@localhost ~]#
同时处理多个信号
[root@localhost ~]# trap "" 1 2 3 15 20
[root@localhost ~]# trap -p
trap -- '' SIGHUP
trap -- '' SIGINT
trap -- '' SIGQUIT
trap -- '' SIGTERM
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
#TSTP(20)命令没有显示出来,但脚本中可以显示出来
[root@localhost ~]#
[root@localhost scripts]# cat trap.sh
trap "" 1 2 3 15 20
trap -p
[root@localhost scripts]# sh trap.sh
trap -- '' HUP
trap -- '' INT
trap -- '' QUIT
trap -- '' TERM
trap -- '' TSTP
[root@localhost scripts]#
不能同时恢复多个信号
[root@localhost scripts]# trap HUP INT QUIT TERM TSTP
[root@localhost scripts]# trap -p
trap -- '' SIGHUP
trap -- 'HUP' SIGINT
trap -- 'HUP' SIGQUIT
trap -- 'HUP' SIGTERM
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
root@localhost scripts]# trap ":" HUP INT QUIT TERM TSTP
:是内置命令
root@localhost scripts]# help :
:: :
空的命令。
没有效果; 此命令不做任何操作。
退出状态:
总是成功。
[root@localhost scripts]#
案例1 :触发信号清理文件
[root@localhost scripts]# cat touch_files.sh
#!/bin/bsah
trap "find /tmp -type f -name "abc_*"|xargs rm -f && exit" INT
while true
do
touch /tmp/abc_$(date +%F-%T)
usleep 500
done
[root@localhost scripts]#
再开一个终端查看变法
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# watch ls
[root@localhost tmp]#
案例2shell跳板机
1)首先做好ssh key 验证或使用expect
2)实现传统的远程连接菜单选择者脚本
3)利用Linux信号防止用户在跳板机上操作
4)用登录后立即调用脚本
第一:
设置ssh key
ssh-keygen -t dsa -P ‘’ -f ~/.ssh/id_dsa #这种格式不用交互;man ssh-keygen
ssh-copy-id -i .ssh/id_dsa.pub -p22 root@192.168.0.3
第二:
/etc/profile.d 加载系统登录的第一目录;没有执行权限也可执行
第三
调试shell脚本并添加到/etc/profile.d/ 目录里
[root@tiaobanji ~]# cat /servers/scripts/tiaoban.sh
#!/bin/bash
function trapper(){
trap ‘' INT QUIT TSTP TERM HUP
}
function menu(){
cat <<-EOF <<===EOF前面是一个减号
=============HOST LIST================
1)192.168.0.3
2)192.168.0.4
3)192.168.1.11
EOF<==EOF 前面是一个tab键,非4个空格
}
function host(){
case "$1" in
1)
ssh -p22 root@192.168.0.3
;;
2)
ssh -p22 root@192.168.0.4
;;
6|*)
exit
;;
esac
}
function main(){
while true
do
trapper
clear
menu
read -p "please select:" num
host $num
done
}
main
[root@tiaobanji ~]#
[root@tiaobanji ~]# cat -A /servers/scripts/tiaoban.sh 显示全部内容包括隐藏
#!/bin/bash$
function trapper(){$
trap '' INT QUIT TSTP TERM HUP$
}$
$
function menu(){$
^Icat <<-EOF$
=============HOST LIST================$
^I1)192.168.0.3$
^I2)192.168.0.4$
^I3)192.168.1.11$
^IEOF$
}$