linux命令行与shell脚本编程 -----15控制脚本

时间:2023-03-09 03:12:15
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
^Z
[]+ 已停止 sleep

方括号中的数字是shell分配的作业号,shell将shell中运行的每个进程称为作业,并为每个作业分配一个唯一的作业号。

知道作业的PID号,可以利用kill命令来发送SIGKILL信号来终止它:

kill - 

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=
while [ $count -le ]
do
echo "LOOP #$count"
sleep
count=$[ $count + ]
done
echo This is the end of the test program

本例中用到的trap命令会在每次检测到SIGINT或者SIGTERM信号时显示一行简单的文本消息。

4.捕捉脚本的退出

要捕捉shell脚本的退出,只要在trap命令后加上EXIT信号就行:

#!/bin/bash
trap "echo byebye" EXIT
count=
while [ $count -le ]
do
echo "loop #$count"
sleep
count=$[$count + ]
done

当脚本运行到常规的退出点时,捕捉就被触发了,shell会执行你在trap命令行指定的命令。

EXIT捕捉即使是在提前退出脚本时也会工作。