1. 处理信号
1.1 Linux 信号
- Linux系统和应用程序可以生成超过30个信号,下表列出了常用的信号
信号 | 值 | 描述 |
---|---|---|
1 | SIGHUP | 挂起进程 |
2 | SIGINT | 终止进程 |
3 | SIGQUIT | 停止进程 |
9 | SIGKILL | 无条件终止进程 |
15 | SIGTERM | 尽可能终止进程 |
17 | SIGTOP | 无条件停止进程,但不是终止进程 |
18 | SIGSTP | 停止或暂停进程,但不终止进程 |
19 | SIGCONT | 继续运行停止的进程 |
1.2 生成信号
1.2.1 中断进程
- Ctrl+C组合键会生成SIGINT信号,在超时前按下Ctrl+C组合键,就可以提前终 止sleep命令。
1.2.2 暂停命令
- Ctrl+Z组合键会生成一个SIGTSTP信号,停止shell中运行的任何进程。
停止(stopping)进程跟终止(terminating)进程不同:停止进程会让程序继续保留在内存中,并能从上次停止的位置 继续运行。
- 当用Ctrl+Z组合键时,shell会通知你进程已经被停止了。
$ sleep 100
^Z
[1]+ Stopped sleep 100
$
-
方括号中的数字是shell分配的作业号(job number)。shell将shell中运行的每个进程称为作业
-
可以用ps命令来查看已停止的作业。
$ sleep 100
^Z
[1]+ Stopped sleep 100
$
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 501 2431 2430 0 80 0 - 27118 wait pts/0 00:00:00 bash
0 T 501 2456 2431 0 80 0 - 25227 signal pts/0 00:00:00 sleep
0 R 501 2458 2431 0 80 0 - 27034 - pts/0 00:00:00 ps
$
- 在S列中(进程状态),ps命令将已停止作业的状态为显示为T。
1.3 捕获信号
- 如果脚本收到了trap命令中列出的信号,该信号不再 由shell处理,而是交由本地处理, 格式如下:
trap commands signals
- 每次使用Ctrl+C组合键,脚本都会执行trap命令中指定的echo语句,而不是处理该信号并 允许shell停止该脚本。
- 案例:
$ cat test1.sh
#!/bin/bash
# Testing signal trapping
#
trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT
#
echo This is a test script
#
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
echo "This is the end of the test script"
===========================================
$ ./test1.sh
This is a test script
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
^C Sorry! I have trapped Ctrl-C
Loop #6
Loop #7
Loop #8
^C Sorry! I have trapped Ctrl-C
Loop #9
Loop #10
This is the end of the test sc