Linux使用信号与系统上运行的进程进行通信!系统和应用程序生成的信号有30多个,常见的如图:
信号 | 值 | 描述 |
1 | SIGHUP | 挂起进程 |
2 | SIGINT | 终端进程 |
3 | SIGQUIT | 停止进程 |
9 | SIGKILL | 无条件终止进程 |
15 | SIGTERM | 如果可能的话终止进程 |
17 | SIGSTOP | 无条件停止,但不终止进程 |
18 | SIGTSTP | 停止或暂停进程,但不终止进程 |
19 | SIGCONT | 重新启动停止的进程 |
默认情况下,bash shell会忽略它接收的任何SIGQUIT(3)和SIGTERM(15)信号。但是,bash shell会处理它收到的任何SIGHUP(1)和SIGINT(2)信号
生成信号:
bash shell可以使用键盘上的组合键,生成两个基本的Linux信号。若需要暂停或者停止,就可以派上用场!
- 中断进程(Ctrl+C)可以生成SIGINT信号
- 暂停进程(Ctrl+Z)可以生成SIGTSTP信号
中断进程和暂停进程不同,暂停进程仍然保留在内存中,能够从停止的地方继续运行
[[email protected] ~]# sleep 5
[1]+ Stopped sleep 5
方括号[1]:数字1是shell分配的作业编号(job number)
[[email protected] ~]# ps au
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 6904 0.0 0.0 4916 1520 pts/1 Ss 11:06 0:00 -bash
root 7548 0.0 0.0 3960 476 pts/1 T 15:34 0:00 sleep 5
root 7555 0.0 0.0 4504 936 pts/1 R+ 15:38 0:00 ps au
ps命令将停止作业的状态显示为T,只需要再次键入exit命令,shell将退出,并终止停止作业!
还可以使用Kill命令终止它!
[[email protected] ~]# kill -9 7548
捕捉信号:
trap命令指定能够通过shell脚本监控和拦截linux信号。如果脚本收到trap命令中列出的信号,它将不被shell处理
trap命令格式:
trap commands signals
#!/bin/bash
trap "echo Haha" SIGINT SIGTERM
echo "This is a test program"
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
sleep 10
count=$[ $count +1 ]
done
echo "This is the end of the test program"
[[email protected] ~]# ./test48.sh
This is a test program
Loop #1
Loop #2
Loop #3
Loop #4
Haha
Loop #5
Haha
Loop #6
Haha
Loop #7
Haha
Loop #8
Haha
Loop #9
Haha
Loop #10
Haha
每次按Ctrl+C组合键时,脚本执行trap命令中指定的echo语句,显示“Haha ”
捕获脚本退出:
命令格式:trap command EXIT
#!/bin/bash
trap "echo byebye" EXIT
count=1
while [ $count -le 5 ]
do
echo "loop #$count"
sleep 3
count=$[ $count + 1 ]
done
[[email protected] ~]# ./test49.sh
loop #1
loop #2
loop #3
loop #4
loop #5
byebye
按Ctrl+C组合键时,出发trap命令
移除捕获:
要移除捕获,使用破折号作为命令和想要恢复正常行为的信号列表:
#!/bin/bash
trap "echo byebye" EXIT
count=1
while [ $count -le 5 ]
do
echo "loop #$count"
sleep 3
count=$[ $count + 1 ]
done
trap - EXIT
echo "I just removed the trap"
[[email protected] ~]# ./test49.sh
loop #1
loop #2
loop #3
loop #4
loop #5
I just removed the trap