信號
linux通過信號來在運行在系統上的進程之間通信也可以通過信號來控制shell腳本的運行
(1)捕捉信號:trap命令
- 常用信號 ctrl+c(終止進程) ctrl+z(暫停進程,打入後臺)
[root@server ~]# trap "echo westos" 2
[root@server ~]# ^Cwestos
(2)列出中斷信號與鍵盤的關係
[root@server ~]# stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; 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
(3)信號屏蔽
[root@server ~]# trap "" 2 ##信號屏蔽
[root@server ~]# trap : 2 ##恢復信號
(4)腳本形式:
#!/bin/bash
trap "echo 'Sorry!I have trapped Ctrl+C'" 2
echo "This is a test script~"
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
sleep 2
count=$[ $count + 1 ]
done
echo "This is the end of the script~"
trap - 2 ##恢復
echo "I just removed the trap"
(5)捕捉腳本的退出
[root@server ~]# cat trap.sh
trap "echo ByeBye~" EXIT
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 2
count=$[ $count + 1 ]
done
[root@server ~]# sh trap.sh
Loop #1
Loop #2
Loop #3
^CByeBye~
(6)練習
- 執行腳本時,使用ctrl+c可以將/tmp/westos下建立的文件都刪除掉
#!/bin/bash
trap "find /tmp -type f -name "westos_*" | xargs rm -f && exit " 2
while true
do
touch /tmp/westos_$(date +%F-%N-%M-%S)
sleep 2
ls -l /tmp/westos*
done