linux命令行与shell脚本编程 -----15控制脚本
常见的Linux系统信号
信号 | 值 | 描述 |
1 | SIGHUP | 挂起进程 |
2 | SIGINT | 终止进程 |
3 | SIGQUIT | 停止进程 |
9 | SIGKILL | 无条件终止进程 |
15 | SIGTERM | 可能的话终止进程 |
17 | SIGSTOP | 无条件停止进程,但不是终止进程 |
18 | SIGTSTP | 停止或暂停进程,但不终止进程 |
19 | SIGCONT | 继续运行停止的进程 |
1.终止信号
ctrl+C生成SIGINT信号,并将其发送给shell中当前运行的所有进程。
2.暂停进程
CTRL+Z生成SIGTSTP信号,停止shell中运行的任何进程。
停止进程和终止进程不同,停止进程会让程序继续保留在内存中,并能从上次停止的位置继续运行。
当你用CTRL+Z组合键时,shell会通知你进程已经被停止了。
liuxj@liuxj-Lenovo:~/shell_test$ sleep 100 ^Z [1]+ 已停止 sleep 100
方括号中的数字是shell分配的作业号,shell将shell中运行的每个进程称为作业,并为每个作业分配一个唯一的作业号。
知道作业的PID号,可以利用kill命令来发送SIGKILL信号来终止它:
kill -9 2069
3。捕捉信号
trap允许你指定shell脚本要观察哪些Linux信号并从shell中拦截。如果脚本中收到trap命令列出的信号,它会阻止它被shell处理,而在本地处理它。
trap commands signals
你可以用数值或者Linux信号名来指定信号。
trap "echo ' Sorry! I have trapped Ctrl -C'" SIGINT SIGTERM echo This is a test program count=1 while [ $count -le 10 ] do echo "LOOP #$count" sleep 5 count=$[ $count + 1 ] done echo This is the end of the test program
本例中用到的trap命令会在每次检测到SIGINT或者SIGTERM信号时显示一行简单的文本消息。
4.捕捉脚本的退出
要捕捉shell脚本的退出,只要在trap命令后加上EXIT信号就行:
#!/bin/bash trap "echo byebye" EXIT count=1 while [ $count -le 5 ] do echo "loop #$count" sleep 3 count=$[$count + 1 ] done
当脚本运行到常规的退出点时,捕捉就被触发了,shell会执行你在trap命令行指定的命令。
EXIT捕捉即使是在提前退出脚本时也会工作。